合并到EXE的DLL?

我有两个DLL文件,我想包括在我的EXE文件,以便更容易地分发它。 我已经在这里和那里读了一些怎么做,甚至在这里发现了一个很好的线程,但是这对我来说太复杂了,而且我需要关于如何做到这一点的基本指导。

我正在使用Microsoft Visual C#Express 2010,请原谅我的“低标准”问题,但我觉得我比其他人的经验低一到两个级别:/如果有人可以指出如何合并这些DDL文件我的EXE在一步一步的指导下,这将是非常棒的!

对于.NET Framework 4.5

ILMerge.exe /target:winexe /targetplatform:"v4,C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" /out:finish.exe insert1.exe insert2.dll 

ILMerge

  1. 打开CMD并cd到你的目录。 让我们说: cd C:\test
  2. 插入上面的代码。
  3. /out:finish.exe用你想要的任何文件名replacefinish.exe
  4. /out:finish.exe后面,您必须提供要合并的文件。

下载ilmerge和ilmergre gui 。 使join文件很容易使用这些和伟大的作品

将DLL引用到您的资源并使用AssemblyResolve事件返回资源DLL。

 public partial class App : Application { public App() { AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { Assembly thisAssembly = Assembly.GetExecutingAssembly(); //Get the Name of the AssemblyFile var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll"; //Load form Embedded Resources - This Function is not called if the Assembly is in the Application Folder var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name)); if (resources.Count() > 0) { var resourceName = resources.First(); using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { if (stream == null) return null; var block = new byte[stream.Length]; stream.Read(block, 0, block.Length); return Assembly.Load(block); } } return null; }; } } 

下载

ILMerge

呼叫

 ilmerge /target:winexe /out:c:\output.exe c:\input.exe C:\input.dll 
  1. 像其他线程一样安装ILMerge

  2. 然后转到安装文件夹,默认情况下是C:\Program Files (x86)\Microsoft\ILMerge

  3. 拖动您的Dll和Exes到该文件夹

  4. 按住Shift键,在该文件夹中单击并select打开命令提示符

  5.  ilmerge myExe.exe Dll1.dll /out:merged.exe 

    请注意,你应该先写你的exe。

你有你的合并EXE。 这可能不是最好的方法,如果你要多次这样做,但最简单的一次使用,我会build议把Ilmerge放在你的路上。

使用Costura.Fody 。

你只需要安装nuget ,然后做一个构build 。 最终的可执行文件将是独立的

 static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { /* PUT THIS LINE IN YOUR CLASS PROGRAM MAIN() */ AppDomain.CurrentDomain.AssemblyResolve += (sender, arg) => { if (arg.Name.StartsWith("YOURDLL")) return Assembly.Load(Properties.Resources.YOURDLL); return null; }; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } 

首先将DLL添加到您的项目资源。 添加一个文件夹“资源”

你也可以在带有GUI界面的codeplex上使用ilmergertool 。

我为VB.NET回答了一个类似的问题。 不应该太难转换。 您将DLL'sembedded到您的“资源”文件夹中,第一次使用时, AppDomain.CurrentDomain.AssemblyResolve事件被触发。

如果您想在开发过程中引用它,只需将正常的DLL引用添加到您的项目。

将一个DLLembedded到一个项目中

这是官方文件 。 这也会在第2步自动下载。

下面是一个非常简单的方法来做到这一点,我已经成功地使用.NET framework 4.6.1构build我的应用程序

  1. 通过gui或命令行安装ILMerge nuget包:

     Install-Package ilmerge 
  2. 确认你已经下载了它。 现在安装(不确定这个命令,但只是去你的nuget包): 在这里输入图像描述 注意:如果您有多个解决scheme,您可能只需要安装它就可以解决您的一个解决scheme

  3. 导航到您的解决scheme文件夹,在包文件夹中,您应该看到带有可执行文件的“ILMerge”:

     \FindMyiPhone-master\FindMyiPhone-master\packages\ILMerge.2.14.1208\tools 

    在这里输入图像描述

  4. 现在这里是你可以拷贝到你的\bin\Debug (或者你的应用程序被构build)的可执行文件,然后在commandline / powershell中执行如下所示的操作:

     ILMerge.exe myExecutable.exe myDll1.dll myDll2.dll myDlln.dll myNEWExecutable.exe 

现在您将拥有一个新的可执行文件,将您的所有库合并为一个!

该命令应该是以下脚本:

 ilmerge myExe.exe Dll1.dll /target:winexe /targetplatform:"v4,c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\" /out:merged.exe /out:merged.exe