在构建服务器上注册COM引用的DLL

lys*_*cid 13 c# msbuild continuous-integration interop com-interop

我们正在开发一个引用一些COM库的C#应用​​程序(例如AutoIT).

我在源控件下包含所有引用的组件,在第三方"Libs"文件夹中.

问题是COM dll在.csproj文件中没有HintPath属性,我认为必须使用regsvr32(或使用某种脚本)手动注册这些属性.

我目前正在寻找创建一个将在每次构建之前运行的MSBuild脚本,但是我无法弄清楚我应该手动调用regsvr32.exe还是使用一些预定义的MSBuild任务?

目前,这是我作为测试所支持的:

 <?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>
Run Code Online (Sandbox Code Playgroud)

这会生成我在给定文件夹中放置的DLL不是有效DLL的错误.

什么是这个问题的好方法?

编辑:

引用COM dll的项目在.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>
Run Code Online (Sandbox Code Playgroud)

这不包括任何提示路径作为其他托管程序集,因此在构建服务器上,找不到引用的COM dll.

使用REGSVR32在构建服务器上注册COM dll时,构建成功.

Dav*_*ton 13

对于我对类似问题的原始答案,请参阅:TFS构建服务器和COM引用 - 这是否有效?

构建服务器的更好选择可能是使用COMFileReference项目文件中的项而不是COMReference.一个例子看起来像这样:

<ItemGroup>
   <COMFileReference Include="MyComLibrary.dll">
     <EmbedInteropTypes>True</EmbedInteropTypes>
   </COMFileReference>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

COM dll无需在机器上注册即可使用.

每个COMFileReference项也可以有一个WrapperTool属性,但默认似乎工作正常.EmbedInteropTypes属性未记录为适用于COMFileReference,但它似乎按预期工作.

有关详细信息,请参阅https://docs.microsoft.com/en-ca/visualstudio/msbuild/common-msbuild-project-items#comfilereference.从.NET 3.5开始,此MSBuild项目已可用.


Han*_*ant 11

您不在构建服务器上注册COM服务器.只有在您真正想要运行已编译的代码时才需要这样做.您需要的是COM服务器的类型库,以便您可以获得互操作程序集.您使用Tlbimp.exe创建的.

您是想在构建服务器上运行Tlbimp还是在开发机器上预先运行Tlbimp,这在很大程度上取决于您如何部署这些COM服务器.保持COM可执行文件和.tlb文件的副本非常靠近您的互操作库是一个好主意.换句话说,检查它们.安装程序现在也可以检索已知良好版本的COM服务器.

  • 从项目中删除引用。使用 Add Reference + Browse 选项卡将其添加回来,选择互操作程序集。您现在将拥有一个常规的 `&lt;Reference&gt;` 而不是 `&lt;COMReference&gt;`。带有提示路径。 (2认同)