2012-01-12 85 views
5

形势
我运行执行许多建造了许多项目构建系统。为了避免一个构建影响另一个构建,我们将构建用户锁定到其工作空间。构建以只有工作区写入能力的非特权用户运行。如何C#简单地使用传统DLL未经登记(REGSVR32)

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

问题
是否有登记之外的其他任何选项来处理遗留的DLL其中暴露通过COM它们的接口?

感谢您的帮助

彼得

+0

在.NET中COM通常是通过Interop完成的,以便在.NET中注册.DLL,它们被称为程序集,可以通过多种方法完成......通过在项目级别通过VS IDE添加引用或编写代码并通过.Config文件卸载程序集,该文件具有对程序集的引用以及在该项目中对该引用的使用... GAC .. – MethodMan 2012-01-12 21:45:12

+0

当您构建时,注册是永远不需要的。 COM使用类型库来公开接口。如果你看到Regasm.exe被使用,那么你做错了。使用Tlbexp.exe – 2012-01-12 22:43:26

回答

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

1
  • 如果您有机会获得第三方.DLL的,你可以GAC他们,在你的项目中引用它们
  • 您可以在使用添加你.cs文件头以及通过右键单击引用添加引用项目 - >添加引用...
  • 您还可以执行上述步骤以及在该属性中设置copy local = true .dll ..我希望这给你一些想法..请记住,.NET程序集是托管代码,因此有多种方法可以使用C#中的其他方法来使用这些第三方.DLL,如LoadFromAssembly等。
1

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

0

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

再次感谢 彼得

6

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

编译引用COM组件没有被登记在构建服务器是COM组件.NET代码的一个好办法在项目/构建文件中使用COMFileReference参考项而不是COMReference。一个COMFileReference项目看起来是这样的:

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

由于Visual Studio提供了COMFileReference没有设计师的支持,你必须编辑项目/手工打造的文件。

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

每个COMFileReference项目也可以有一个WrapperTool属性,但默认情况下似乎对我来说很好。 EmbedInteropTypes属性没有记录为适用于COMFileReference,但它似乎按预期工作。

请参阅http://msdn.microsoft.com/en-us/library/bb629388.aspx了解更多细节。这个MSBuild项目自.NET 3.5起可用。

这是一个耻辱,没有人似乎知道任何关于这种技术,这对我来说似乎比替代品简单。这实际上并不令人意外,因为我只能在网上找到上面提到的那个。我自己通过挖掘MSBuild的Microsoft.Common.targets文件发现了这种技术。