可以将 DLL 合并到 .NET EXE 中吗? [复制]

Posted

技术标签:

【中文标题】可以将 DLL 合并到 .NET EXE 中吗? [复制]【英文标题】:Possible to merge a DLL into a .NET EXE? [duplicate] 【发布时间】:2011-06-05 14:50:00 【问题描述】:

我有一个 DLL,用于存储两个应用程序共有的类。我想将我的应用程序限制在一个 EXE 文件中,并想看看我是否可以以某种方式将此 DLL 嵌入到我的主 EXE 中。

如何将外部 DLL 嵌入到我的应用程序中? (如果可能的话)

【问题讨论】:

更改了标题,因为 DLL 注入是一个重载术语。 【参考方案1】:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=22914587-b4ad-4eae-87cf-b14ae6a939b0&displaylang=en

ILMerge 是一个用于将多个 .NET 程序集合并到一个 .NET 程序集的实用程序。它适用于可执行文件和 dll。它带有几个用于控制输出处理和格式的选项,有关详细信息,请参阅随附的文档。

【讨论】:

【参考方案2】:

ILMerge 的替代方法是将依赖程序集作为嵌入式资源嵌入到可执行文件中,并利用assembly resolve 机制将它们作为资源流加载。可以在此处找到如何执行此操作的示例:

http://blog.magenic.com/blogs/brante/archive/2008/04/14/Embedded-Assembly-Linker.aspx

我自己使用这种模式,效果很好。 ILMerge 有时会出现问题,因此您的里程数可能会有所不同。

【讨论】:

为什么要使用 ILMerge 来做这件事? @Pauli 正如我提到的,ILMerge 在某些情况下存在问题,例如它与某种混淆(我们有混淆程序集)作斗争,它与 WPF Xaml 资源有问题,它在合并多个 WPF 程序集时遇到问题,因为 Xaml 编译器在每个程序集中放置一个具有相同名称的帮助器类型在相同的命名空间中导致ILMerge 吐出重复的类型。这些只是我个人遇到的。 确实,具有相同全名(命名空间+类型名)的类型会带来麻烦...我不知道允许将多个包含具有相同全名的类型的程序集加载到一个 AppDomain像这样吗?这是一个不错的技巧,允许将程序集存储在数据库中或通过 Internet 下载。 @Pauli 是的,这是一个不错的技巧 - 现在投票给我! :)【参考方案3】:

Eazfuscator.NET 是一个很棒的工具,它还允许 dll 合并和嵌入,以及它的正常混淆功能。它还对混淆代码进行了一些巧妙的优化。您只需添加一个类注释,而不是弄乱 ilmerge,eazfuscator 将为您做所有事情。太棒了!

[assembly: System.Reflection.Obfuscation(Feature = "encrypt symbol names with password PAS$", Exclude = false)]
[assembly: System.Reflection.Obfuscation(Feature = "embed nLog.dll", Exclude = false)]
public class MyClass 
  //blah

【讨论】:

Eazfuscator 的输出在哪里? Eazfuscator 与 Visual Studio 集成时,仅在编译器的输出上就地运行。所以无论你的 bin/Release 文件夹中有什么。如果你想做一些可定制的事情,你也可以使用 msbuild 手动编写脚本。 @scaryman 您能否在使用“wonderful”时透露是否存在隶属关系? (没有说它只是——没有这样的从属关系会使其在我的估计中上升披露 我与 eazfuscator 无关。另外,我在他们开始收费之前发了这篇文章。

以上是关于可以将 DLL 合并到 .NET EXE 中吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我们可以将回调函数放在dll中吗?

ilmerge 可以将c++的dll合并吗

我可以将 LowLevelMouseProc 和 LowLevelKeyboardProc 放在主 EXE 中吗?

如何将 C++ windows dll 合并到 C# 应用程序 exe 中?

c#如何合并多个dll文件

一个.Net进程中的不同平台AppDomains?