【发布时间】:2011-11-21 19:58:44
【问题描述】:
在我的开发人员 PC 上,我已经注册了相应的 dll 并引用了它们。 (添加参考-> COM) 在 TFS 构建服务器上,这当然会导致错误,因为引用没有在那里注册,将来也不会。
规避此问题的最佳方法是什么?
【问题讨论】:
-
这是正确的 Hans,非常感谢 - tlbimp 是你的朋友。
在我的开发人员 PC 上,我已经注册了相应的 dll 并引用了它们。 (添加参考-> COM) 在 TFS 构建服务器上,这当然会导致错误,因为引用没有在那里注册,将来也不会。
规避此问题的最佳方法是什么?
【问题讨论】:
好的,答案比人们想象的要容易。 只需使用“tlbimp.exe”创建一个相应的 intrerop.dll,您将其包含在您的项目中,并引用此 dll 而不是 COM 对象。
您可以使用 tlbimp.exe 节省时间,因为 Visual Studio 会在您引用 COM 对象时自动创建此 dll。 但它不会将其上传到 TFS。所以最后我只是使用了自动创建的 dll 并且 TFS 构建服务器很开心。
可以在以下位置找到自动创建的 Interop dll:“ProjectFolder\obj\x86\Development”
【讨论】:
不需要直接使用 tlbimp.exe。尝试用<COMFileReference> 替换项目文件中的任何<COMReference> 项。一个示例如下所示:
<ItemGroup>
<COMFileReference Include="MyComLibrary.dll">
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMFileReference>
</ItemGroup>
COM dll 不需要在机器上注册就可以工作。
每个 COMFileReference 项也可以有一个 WrapperTool 属性,但默认值似乎可以正常工作。 EmbedInteropTypes 属性未记录为适用于 COMFileReference,但它似乎按预期工作。
有关更多详细信息,请参阅https://docs.microsoft.com/en-ca/visualstudio/msbuild/common-msbuild-project-items#comfilereference。此 MSBuild 项自 .NET 3.5 起可用。
【讨论】:
对于命名空间有问题的人:
tl;dr: 使用 tlbImp /namespace: YOUR_NAMESPACE 给你的 dll 一个命名空间
这个solution 也适用于 Azure Pipeline。但起初我在使用 COMFileReference 时遇到了麻烦。当我用 COMFileReference 替换 COMReference 时,我的 VS 构建失败说“找不到命名空间”。终于找到了解决办法here。
我使用 tlbImp 在 article 之后使用 /namespace 属性生成 COM 文件的 dll。只有这样你才能使用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>
【讨论】: