将 DLL 合并到 EXE? ?

我有两个 DLL 文件,我想包括在我的 EXE 文件,使它更容易分发。我已经在这里和那里读了一点如何做到这一点,甚至找到了一个很好的线程 给你,和 给你,但它太复杂了,我需要真正的基本指示如何做到这一点。

我使用的是 Microsoft Visual C♯的 Express 2010,请原谅我的“低标准”问题,但我觉得我比其他人的专业水平低了一两个层次:-/如果有人能指出如何将这些 DDL 文件合并到我的 EXE 中,这将是一个非常棒的 真的指南!

123365 次浏览

对于.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用您想要的任何文件名替换 finish.exe
  4. /out:finish.exe后面,你必须给出你想要的文件 合并。

下载

ILMerge

ilmerge /target:winexe /out:c:\output.exe c:\input.exe C:\input.dll

对于 VB.NET,我也回答了类似的问题。然而,转变信仰应该不会太难。将 DLL's嵌入到 Ressource文件夹中,在第一次使用时,将 AppDomain.CurrentDomain.AssemblyResolve事件被激发。

如果您想在开发过程中引用它,只需在项目中添加一个普通的 DLL引用即可。

将 DLL 嵌入到项目中

  1. 安装 ILMerge 正如其他线程告诉您的那样

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

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

  4. Shift-右击该文件夹并选择打开命令提示符

  5. 写作

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

    请注意,您应该首先编写您的 exe。

这就是你合并后的前任,这可能不是最好的方式 这样做多次,但最简单的一次使用,我会 建议把伊尔合并放在你的路径上。

将 DLL 引用到您的参考资料中,并使用 AssemblyResolve-Event 返回 Resource-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;
};
}
}

你也可以使用带有 GUI 界面的 伊尔默格工具at co 。

下载 融合Lmergre gui。使加入文件如此容易 我用过这些,效果很好

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 添加到您的项目-资源

使用 Costura Fody

您只需要 安装 nuget.org/package/Costura.Fody”rel = “ norefrer”> nuget ,然后进行构建。最终的可执行文件将是 独立的

该命令应该是以下脚本:

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

这里是 正式文件。这也是自动下载的步骤2。

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

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

    Install-Package ilmerge
    
  2. Verify you have downloaded it. Now Install (not sure the command for this, but just go to your nuget packages): enter image description here Note: You probably only need to install it for one of your solutions if you have multiple

  3. Navigate to your solution folder and in the packages folder you should see 'ILMerge' with an executable:

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

    enter image description here

  4. 下面是一个可执行文件,你可以把它复制到你的 \bin\Debug(或者你的应用程序构建的任何地方) ,然后在命令行/powershell 中执行如下操作:

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

You will now have a new executable with all your libraries in one!

注意: 如果要加载非 ILOnly 程序集,则

Assembly.Load(block)

将不起作用,并且将抛出一个异常: 更多细节

我通过创建一个临时文件并使用

Assembly.LoadFile(dllFile)

我发现了以下几个步骤的解决方案:-

  1. 下载 ILMerge.msi 并将其安装到您的计算机上。
  2. 打开命令提示符
  3. Type cd C: Program Files (x86) MicrosoftILMerge 按回车键
  4. C: Program Files (x86) Microsoft ILMerge > ILMerge.exe/target: winexe/targetPlatform: “ v4,C: Windows Microsoft.NET Framework v4.0.30319” /out: NewExeName.exe SourceExeName.exe DllName.dll

对于多个 Dll:-

C: Program Files (x86) Microsoft ILMerge > ILMerge.exe/target: winexe/targetPlatform: “ v4,C: Windows Microsoft.NET Framework v4.0.30319” /out: NewExeName.exe SourceExeName.exe DllName1.dll DllName2.dll DllName3.dll

2019年更新 (仅供参考) :

.NET Core 3.0开始,跳出盒子支持这个特性。要利用单文件可执行文件发布的优势,只需在项目配置文件中添加以下代码行:

<PropertyGroup>
<PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>

现在,dotnet publish应该在不使用任何外部工具的情况下生成一个.exe 文件。

关于这个特性的更多文档可以在 https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md上找到。