在C#中静态链接

时间:2008-09-02 09:44:16

标签: c# visual-studio-2008 linker

我正在研究CMS的模块。该模块作为类库DLL分发。

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

我想只有一个DLL。

3 个答案:

答案 0 :(得分:23)

您可以将许多DLL与ILMERGE合并:

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,并带有几个选项来控制输出的处理和格式。有关详细信息,请参阅随附的文档。

答案 1 :(得分:12)

如果您不想使用ILMerge,请参阅此页:

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

编辑注释:Jeffrey Richter建议将您的dll作为资源放入exe文件中(对于您添加的每个DLL文件,显示其属性并将其“Build Action”更改为“Embedded Resource” 。” )。然后需要一个自定义类加载器来使可执行文件工作(在运行时,CLR将无法找到相关的DLL程序集,这是一个问题。要修复此问题,当您的应用程序初始化时,请注册回调使用AppDomain的ResolveAssembly事件的方法)。

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

答案 2 :(得分:2)

这个简短的答案是否定的! 编译期间无法链接到dll。 我不知道是否有一些微妙的方法可以做到这一点,但你可能不得不分配dlls和你的cms。 这样做的最好方法是进行某种可重新分配。