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

时间:2012-01-12 21:39:49

标签: c# visual-studio com build registration

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

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

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

感谢您的帮助

彼得

5 个答案:

答案 0 :(得分:9)

对于我对类似问题的原始回答,请参阅:TFS Build server and COM references - does this work?

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

<ItemGroup>
  <COMFileReference Include="MyComLibrary.dll">
    <EmbedInteropTypes>True</EmbedInteropTypes>
  </COMFileReference>
</ItemGroup>

由于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文件发现了这种技术。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

.NET中的

通常通过Interop完成,以便在.NET中注册.DLL,它们被称为Assemblies,可以通过多种方式完成...通过在项目级别通过VS IDE添加引用,或者编写Loads代码并通过.Config文件卸载程序集。该文件包含对程序集的引用以及在项目中使用该引用... GAC。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

感谢所有帮助。

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

再次感谢 彼得