2008-09-02 97 views
16

我正在为CMS的模块工作。这个模块是作为一个类库DLL分发的。在C中静态链接#

我有几个实用程序库,我想在这个模块中使用。无论如何,我可以静态链接这些库,因此我不必分发多个DLL(从而分别分发我的实用程序库)?

我想只有一个DLL。

回答

23

您可以ILMERGE合并的许多DLL文件:

http://research.microsoft.com/~mbarnett/ILMerge.aspx

还没有尝试过自己。希望能帮助到你。


这里下载:
http://www.microsoft.com/downloads/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&displaylang=en

简要说明(从下载页面)
ILMerge是合并多个.NET程序集到一个单一的.NET程序集的工具。它适用于可执行文件和DLL,并提供多种选项来控制输出的处理和格式。详细信息请参阅随附的文档。

2

简短的回答是不! 编译期间无法链接到dll。 我不知道是否有一些微妙的方式来做到这一点,但你可能不得不随你的CMS一起分发DLL。 做到这一点的最佳方法是进行某种重新分配。

+0

不正确。看看Kagamar的回答。另请参阅Mike Barnett的评论部分。 – Kobor42 2013-10-24 09:11:21

+2

@ Kobor42:错,这不是链接这是合并。虽然最有回报的答案可以回答问题的意图(因此也是最有用的答案),但只要能够正确回答问题,khebbie的答案实际上是正确的答案。你甚至不能在C/C++中链接一个DLL,你需要一个静态存档来做到这一点...... – 2014-09-19 08:59:57

+0

这个答案在技术上是正确的没有upvotes是很搞笑的。 C#是一种托管语言,甚至ILMerge也是一个汇编合并,而不是链接器。正如C++和C开发人员所理解的,链接器目前不存在于.NET中。然而,2015年年中尚未发布的“.Net原生”技术可能在某一天发布,允许完全编译(无MSIL)应用程序,然后可以静态链接。 – 2015-09-16 14:00:17

12

如果你不想使用ILMerge,看到这个页面:

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

编者按:杰弗里里希特建议把你的dll成EXE文件作为资源(对于每一个DLL文件您添加,显示其属性并将其“生成操作”更改为“嵌入式资源”,)。然后需要自定义类加载器来使可执行文件工作()在运行时,CLR将无法找到依赖的DLL程序集,这是一个问题。要解决此问题,在应用程序初始化时,注册一个回调方法AppDomain的ResolveAssembly事件)。

务必将resourceName字符串更改为指向您的实际资源。 (例如,将AssemblyLoadingAndReflection更改为您的项目名称。)