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

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

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


除了注册之外还有其他选项来处理通过COM公开其接口的遗留DLL吗?

谢谢您的帮助

彼得

这里有免注册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文件,假设注册点只是为了能够成功编译,而不是运行特定的测试。

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

编译引用COM组件而不在构建服务器上注册COM组件的.NET代码的好方法是使用项目/构建文件中的COMFileReference引用项而不是COMReferenceCOMFileReference项如下所示:

   True   

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

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

每个COMFileReference项也可以有一个WrapperTool属性,但默认似乎对我WrapperToolEmbedInteropTypes属性未记录为适用于COMFileReference ,但它似乎按预期工作。

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

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

  • 如果您可以访问第三方.DLL,您可以GAC它们,并在您的项目中引用它们
  • 您可以在.cs文件头中添加一个使用,也可以通过右键单击引用添加对项目的引用 – >添加引用…
  • 你也可以做上面的步骤,并在.dll的属性中设置copy local = true ..我希望这给你一些想法..请记住.NET程序集是托管代码所以有几种方法消费那些第三方.DLL使用C#中的其他方法,如LoadFromAssembly等。

Installshield等安装工具可以从DLL中提取COM接口并将它们添加到注册表中。 它也可以使用DLL的自注册过程(我相信这是regsvr所做的),但这不是Microsoft安装程序的最佳实践 。

谢谢你的帮助。 我们从早期绑定更改为后期绑定,因为我们在编译时从未真正需要DLL。 这将注册要求从构建服务器推送到集成测试服务器(我们执行处理注册的安装程序)。 我们尝试保持构建系统的原始性并具有易于重置的集成系统。

再次感谢彼得