TFS构建服务器和COM引用 - 这能行吗?

7
在我的开发电脑上,我已经注册了相应的dll并引用了它们。(添加引用 -> COM) 在TFS构建服务器上,这当然会导致错误,因为这些引用没有在那里注册,并且将来也不会注册。
如何绕过这个问题是最好的方法?

1
可能是在构建服务器上注册COM引用的DLL的重复问题。 - Hans Passant
1
没错,汉斯,非常感谢 - tlbimp 是你的好帮手。 - Enrico
可能是在构建服务器上注册COM引用的DLL的重复问题。 - StayOnTarget
3个回答

14

不必直接使用tlbimp.exe。尝试将项目文件中的任何<COMReference>项替换为<COMFileReference>。示例如下:

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

COM dll不需要在计算机上注册即可使用。
每个COMFileReference项目还可以有WrapperTool属性,但默认值似乎可以正常工作。 EmbedInteropTypes属性没有被文档记录为适用于COMFileReference,但它似乎可以按预期工作。
请参见https://learn.microsoft.com/en-ca/visualstudio/msbuild/common-msbuild-project-items#comfilereference以了解更多详细信息。此MSBuild项自.NET 3.5以来已经提供。

谢谢你的提示,看起来这是更专业的解决方案。 - Enrico

3

好的,答案比人们想象的要简单得多。 只需使用"tlbimp.exe"创建相应的interop.dll,并将其包含在您的项目中,并引用该dll而不是COM对象。

您可以节省时间使用tlbimp.exe,因为Visual Studio在引用COM对象时会自动创建此dll。 但它不会将其上传到TFS。 因此,最终我只使用了自动创建的dll,而TFS构建服务器也很满意。

可以在“ProjectFolder\obj\x86\Development”中找到自动创建的Interop dll。


这真的帮助了我,因为我只需要一个已经位于应用服务器上的Interop DLL引用。VS 2019只会添加一个没有提示路径的COMReference,这对于Azure DevOps管道构建无法工作。从obj文件夹中取出tlbimp处理后的DLL可以完美解决问题。 - merekel

1

对于任何遇到命名空间问题的人:

简而言之:使用tlbImp /namespace: YOUR_NAMESPACE为您的dll添加命名空间


这个解决方案也适用于Azure Pipeline。但是一开始我在使用COMFileReference时遇到了问题。当我将COMReference替换为COMFileReference时,VS构建失败并显示“找不到名称空间”。最终在这里找到了解决方法。
我使用tlbImp生成了COM文件的dll,使用/namespace属性遵循了文章。只有这样才能在COMFileReference中使用该dll。下面是一个更详细的示例:
<ItemGroup>
   <COMFileReference Include="My/Folder/MyComLibrary.dll">
     <EmbedInteropTypes>True</EmbedInteropTypes>
   </COMFileReference>
</ItemGroup>

或者

<ItemGroup>
   <COMFileReference Include="..\My\parent\folder\MyComLibrary.dll">
     <EmbedInteropTypes>True</EmbedInteropTypes>
   </COMFileReference>
</ItemGroup>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接