我们正在开发引用一些 COM 库(例如 AutoIT)的 C# 应用程序。
我在第 3 方“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>
这会产生错误,指出我放置在给定文件夹中的 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>
这不包括与其他托管程序集一样的任何提示路径,因此在生成服务器上,找不到引用的 COM dll。
使用 REGSVR32 在构建服务器上注册 COM dll 时,构建成功。
最佳答案
有关我对类似问题的原始回答,请参阅:TFS Build server and COM references - does this work?
构建服务器的更好选择可能是在项目文件中使用 COMFileReference
项而不是 COMReference
。一个示例如下所示:
<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 开始可用。
关于c# - 在构建服务器上注册 COM 引用的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7460910/