在创建“类库”类型的项目时,通常可以在编译时生成一个dll,但是如何生成一个dll而不会丢失我已经包含的其他dll?
我用一个例子解释:事实证明Nuget下载了一个S22.Imap dll与我合作的那个,后来我用我在开始时解释的传统方式生成了dll,但是当我想要使用时在另一台计算机上的DLL,我得到的错误不是我找到的包含S22.IMAP dll的函数。所以为了解决这个问题,我不得不在另一台计算机的特定路径中以另外的方式复制我的项目的dll,S22.IMAP。
我的问题是:
如何生成包含您正在使用的项目中包含的dll的dll?
答案 0 :(得分:3)
一般来说, 你没有 。 DLL是动态链接库,通常只在构建期间组合静态库。这是一个answer on the difference between static and dynamic linking。
通常,您将在安装程序包中包含所需的所有DLL。如果使用Visual Studio创建安装程序,它可以为您检测依赖项。运行安装程序时,将部署所有必需的DLL。几乎所有的商业.NET软件都遵循这种模式。
可能使用名为ILMerge的工具将程序集合并到另一个程序集中。这将是 非常 不寻常的事情,可能会导致知识产权和代码签名问题,因此不建议这样做。
答案 1 :(得分:1)
在构建项目时,所有引用的第三方dll(在您的示例中为S22.Imap.dll)将与您自己的dll文件一起复制到输出文件夹(让他们说a.dll)。这意味着你应该总是将它们(S22 + a.dll)一起复制到你想要引用它们的地方,在另一台计算机/文件夹/地方。
如果你真的想让它们只有一个文件(虽然不推荐),你可以将S22设置为一些"嵌套资源"。然后你将只获得一个a.dll文件,而S22一个在a.dll中。请参阅以下页面以获取一些参考:
Embedding one dll inside another as an embedded resource and then calling it from my code
AND,ILMerge是一种可以帮助您这样做的工具。