C#如何在没有注册的情况下使用遗留DLL(regsvr32)

Pet*_*ahn 6 c# com build registration visual-studio

情况
我运行一个构建系统,为许多项目执行许多构建.为了避免一个构建影响另一个构建,我们将构建用户锁定为仅其工作区.构建作为非特权用户运行,只对工作区具有写入功能.

挑战
在我们的新构建期间,我们需要使用通过COM公开其接口的传统3rdparty DLL.开发团队想要注册构建(regsrv32.exe),但我们的构建安全机制阻止了此活动.如果我们放松政权,那么第三方DLL将影响其他构建,如果我有两个构建需要两个不同的版本,我可能有错误的构建编译错误的版本(非常现实的可能性).

问题
除了注册之外还有其他选项可以处理通过COM公开其接口的旧DLL吗?

谢谢您的帮助

彼得

Dav*_*ton 9

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

编译引用COM组件而不在构建服务器上注册COM组件的.NET代码的好方法是使用COMFileReference项目/构建文件中的引用项而不是COMReference.一个COMFileReference项目看起来像这样:

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

由于Visual Studio不提供设计器支持COMFileReference,因此您必须手动编辑项目/构建文件.

在构建期间,MSBuild从COM DLL中提取类型库信息,并创建一个互操作程序集,该程序集可以是独立的,也可以嵌入在调用的.NET程序集中.

每个COMFileReference项目也可以有一个WrapperTool属性,但默认似乎对我有用.该EmbedInteropTypes属性未记录为适用COMFileReference,但似乎按预期工作.

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

遗憾的是,似乎没有人知道这种技术,这对我来说似乎比其他选择更简单.实际上这并不奇怪,因为我只能在线找到上面提到的那个.我自己通过挖掘MSBuild的Microsoft.Common.targets文件发现了这种技术.


Jas*_*rue 3

这里有一个关于免注册 COM 的演练:

http://msdn.microsoft.com/en-us/library/ms973913.aspx

这里有令人痛苦的细节: http://msdn.microsoft.com/en-us/library/aa376414 (该文档的根目录实际上在这里:http://msdn.microsoft.com/en-us/library/dd408052)

另外,对于一般构建,您应该能够使用 Tlbimp 或 tlbexp 创建一个可用于构建的 TLB 文件,假设注册的目的只是为了能够成功编译,而不是运行特定的测试。