Регистрация библиотек DLL с ссылками на COM на сервере сборки - PullRequest
13 голосов
/ 18 сентября 2011

Мы разрабатываем приложение на C #, которое ссылается на несколько COM-библиотек (например, AutoIT).

Я включаю все ссылочные компоненты под управлением исходного кода в стороннюю папку «Libs».

Проблема в том, что в COM-DLL нет свойства HintPath в файле .csproj, и я предполагаю, что они должны быть зарегистрированы вручную с помощью regsvr32 (или с помощью какого-либо сценария).

Яв настоящее время изучаю создание сценария MSBuild, который будет запускаться перед каждой сборкой, однако я не мог понять, должен ли я вручную вызывать regsvr32.exe или использовать какую-то предопределенную задачу MSBuild?

В настоящее время это то, что я 've воспринимается как тест:

 <?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
  <ItemGroup>
    <MyAssemblies Include="D:\*.dll" />
  </ItemGroup>
  <Target Name="Build">
    <RegisterAssembly
      Assemblies="@(MyAssemblies)" >
    </RegisterAssembly>
  </Target>
</Project>

Это приводит к ошибкам, которые DLL, которые я поместил в данную папку, не являются действительными DLL.

Какое хорошее решение для этой проблемы?

РЕДАКТИРОВАНИЕ:

Проекты, которые ссылаются на COM-библиотеки, имеют нечто похожее на это в файле .csproj:

<COMReference Include="AutoItX3Lib">
      <Guid>{F8937E53-D444-4E71-9275-35B64210CC3B}</Guid>
      <VersionMajor>1</VersionMajor>
      <VersionMinor>0</VersionMinor>
      <Lcid>0</Lcid>
      <WrapperTool>tlbimp</WrapperTool>
      <Isolated>False</Isolated>
    </COMReference>

Это не включает путь подсказки, так какдругие управляемые сборки, поэтому на сервере сборки ссылка DLL COM не найдена.

При регистрации библиотеки DLL COM на сервере сборки с помощью REGSVR32 сборка завершается успешно.

Ответы [ 4 ]

13 голосов
/ 17 января 2012

Мой первоначальный ответ на аналогичный вопрос см .: Сервер сборки TFS и ссылки на COM - это работает?

Лучшим вариантом для серверов сборки может быть использование COMFileReferenceэлемент в файле вашего проекта вместо COMReference.Пример может выглядеть следующим образом:

<ItemGroup>
   <COMFileReference Include="MyComLibrary.dll">
     <EmbedInteropTypes>True</EmbedInteropTypes>
   </COMFileReference>
</ItemGroup>

. Для того, чтобы это работало, COM-библиотеку не нужно регистрировать на компьютере.

Каждый элемент COMFileReference также может иметь атрибут WrapperTool, но по умолчанию, похоже, работает нормально.Атрибут EmbedInteropTypes не задокументирован как применимый к COMFileReference, но, похоже, он работает как задумано.

См. https://docs.microsoft.com/en-ca/visualstudio/msbuild/common-msbuild-project-items#comfilereference для получения дополнительной информации.Этот элемент MSBuild доступен с .NET 3.5.

11 голосов
/ 18 сентября 2011

Вы не регистрируете COM-серверы на сервере сборки.Это требуется только тогда, когда вы действительно хотите запустить скомпилированный код.Что вам нужно, это библиотеки типов для COM-серверов, чтобы вы могли получить сборки взаимодействия.То, что вы создаете с помощью Tlbimp.exe.

Если вы хотите запустить Tlbimp на сервере сборки или сразу на компьютере разработчика, во многом зависит от того, как вы развернете эти COM-серверы.Хорошая идея - держать копию исполняемых файлов COM и файлов .tlb в непосредственной близости от библиотек взаимодействия.Другими словами, отметьте их. Теперь установщик может получить также заведомо исправную версию COM-сервера.

0 голосов
/ 18 сентября 2011

Я не уверен, что если в MSBuild есть какая-либо задача, вызвать regsvr32, но REgisterAssembly вызывает regasm.exe, то есть регистрирует компоненты .NET для взаимодействия COM.

Я уверен, чтопростой вызов regsvr32 вручную был бы самым быстрым способом достижения желаемого результата.

Другое дело - что произойдет, если COM-библиотеки DLL уже зарегистрированы в предыдущей сборке, и вы снова запустите сценарий сборки?(Я не знаю, как отреагирует regsvr32, просто мысль здесь)

0 голосов
/ 18 сентября 2011

1) Попробуйте ссылаться на библиотеки COM на ваш csproj в качестве ссылок - если вы еще этого не сделали.

2) Попробуйте добавить в ваш файл csproj:

<Project ... >
    ...
    <Target Name="BeforeBuild">
        <Exec Command="regsvr32.exe yourComponent.dll" />
    </Target>
</Project>

PS: если вы используете какое-либо программное обеспечение сервера сборки, вам не следует изменять csproj, а скрипт, используемый сборкой на сервере.

...