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

标签 c# msbuild interop continuous-integration com-interop

我们正在开发引用一些 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/

相关文章:

visual-studio - 如何在 MSBuild 中调用 Web Essentials 任务?

c++ - 使用 msbuild 构建多架构安装程序

c# - 如何调用 C# 委托(delegate)以从 native C 最简单的方式传递字符串数组?

c# - C++ <--> C# 修改字节编码数组

c# - 从 C# 调用 C++ 函数 - 堆栈不平衡

c# - SignalR(v2.2.0) Client.Group() 不适用于 IOS 客户端

c# - 如何在 .ForEach() 方法中使用 continue 语句

c# - XUnit.net 全局跑者

msbuild - 如何告诉 NuGet 使用哪些 MSBuild 可执行文件?

c# - 您可以/如何在 C# WPF 应用程序中托管完整的 VB6 表单?