合并到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
- 打开CMD并cd到你的目录。 让我们说:
cd C:\test
- 插入上面的代码。
-
/out:finish.exe
用你想要的任何文件名replacefinish.exe
。 - 在
/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
-
像其他线程一样安装ILMerge
-
然后转到安装文件夹,默认情况下是
C:\Program Files (x86)\Microsoft\ILMerge
-
拖动您的Dll和Exes到该文件夹
-
按住Shift键,在该文件夹中单击并select打开命令提示符
-
写
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's
embedded到您的“资源”文件夹中,第一次使用时, AppDomain.CurrentDomain.AssemblyResolve
事件被触发。
如果您想在开发过程中引用它,只需将正常的DLL
引用添加到您的项目。
将一个DLLembedded到一个项目中
这是官方文件 。 这也会在第2步自动下载。
下面是一个非常简单的方法来做到这一点,我已经成功地使用.NET framework 4.6.1
构build我的应用程序
-
通过gui或命令行安装ILMerge nuget包:
Install-Package ilmerge
-
确认你已经下载了它。 现在安装(不确定这个命令,但只是去你的nuget包): 注意:如果您有多个解决scheme,您可能只需要安装它就可以解决您的一个解决scheme
-
导航到您的解决scheme文件夹,在包文件夹中,您应该看到带有可执行文件的“ILMerge”:
\FindMyiPhone-master\FindMyiPhone-master\packages\ILMerge.2.14.1208\tools
-
现在这里是你可以拷贝到你的
\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