在C#中将一个DLL嵌入到另一个DLL中

时间:2009-07-29 06:00:54

标签: visual-studio-2008 dll

我正在构建一个类库应用程序,其中包含一些像Skype4COM这样的参考dll,这显然不是本机对象所以我只是想学习如何在构建解决方案之后将这个dll嵌入到我的dll中。

我只是不想看到人们在开发这个应用程序时使用的dll,而且我也不希望他们在使用skype4com.dll将其导入到他们的项目中。

P.s:要使用skype4com.dll,需要使用cmd窗口在windows上注册:regsvr32.exe dllpath

它是否会导致错误或是否有任何解决方法。

提前致谢。

此致。

4 个答案:

答案 0 :(得分:4)

试图隐藏你的依赖关系是一个不好的理由,IMO。除此之外,除非你对代码进行模糊处理,否则任何用反射器等工具反编译它的人都会看到它。

然而,尝试使部署更容易是一个很好的理由。坏消息是,对于.NET 3.5中的COM对象,据我所知,没有简单的安装方法。

好消息是,在C#4.0和.NET 4.0中,有一种替代方法可以更轻松地使用COM部署库。您可以链接 PIA而不是引用它,这使得编译器在您的程序集中嵌入了足够的信息,以获取真正的COM库和您使用的类型/成员。然后,您无需运送或安装PIA。

如果你可以等待.NET 4.0,那就是我为COM PIA采取的方法,但对于其他任何事情,我都会单独发布这个库。除此之外,使用您的库的开发人员可能已经使用了您所依赖的相同类库:引入两个单独的副本会非常混乱。如果您不能等待.NET 4.0(或者不想强迫用户部署它),那么我担心您将不得不以正常方式安装COM PIA。

答案 1 :(得分:1)

当我回答here时,您可以使用Fody.Costura nuget包,其中包含非托管程序集的选项。

答案 2 :(得分:0)

您无法将进程内COM服务器(将使用regsvr32注册的DLL)嵌入到类库程序集中,而COM服务器不会成为功能部件。

向regsvr32注册会将COM服务器中实现的COM类公开给注册表。该服务器的后续使用者将查找注册表以查找COM服务器所在的位置并尝试加载它并调用DllGetClassObject()函数。如果他们不设法这样做,他们将无法使用COM服务器。我确信你不能进行嵌入并保持这种机制的功能。

答案 3 :(得分:0)

此链接可能会有所帮助... IL Merge

但是,ILMerge不适用于非托管类型。