69

我有两个 DLL 文件,我想将它们包含在我的 EXE 文件中,以便于分发它。我在这里和那里阅读了一些如何做到这一点,甚至在这里这里找到了一个很好的线程,但这对我来说太复杂了,我需要关于如何做到这一点的真正基本说明。

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

4

14 回答 14

94

对于 .NET 框架 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

合并

  1. 打开 CMD 并 cd 到您的目录。比方说:cd C:\test
  2. 插入上面的代码。
  3. /out:finish.exe替换finish.exe为您想要的任何文件名。
  4. 在后面/out:finish.exe你必须给你想要合并的文件。
于 2012-04-13T09:08:11.523 回答
34

使用Costura.Fody

您只需要安装nuget然后进行构建。最终的可执行文件将是独立的。

于 2016-11-24T12:15:57.420 回答
25

下载ilmergeilmergre gui。使加入文件变得如此容易,我使用了这些并且效果很好

于 2013-02-21T23:48:23.703 回答
18

将 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;
        };
    }
}
于 2012-04-13T09:31:24.613 回答
10

下载

合并

称呼

ilmerge /target:winexe /out:c:\output.exe c:\input.exe C:\input.dll
于 2012-04-13T09:10:37.163 回答
9
  1. 按照其他线程告诉您的方式安装 ILMerge

  2. 然后进入安装文件夹,默认 C:\Program Files (x86)\Microsoft\ILMerge

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

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

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

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

在那里你得到了合并的 exe。如果您要多次执行此操作,这可能不是最好的方法,但最简单的一次使用,我建议您将 Ilmerge 放在您的路径上。

于 2012-04-13T09:15:51.127 回答
6
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 添加到您的项目资源中。添加文件夹“资源”

于 2013-10-03T13:24:14.677 回答
4

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

于 2019-12-28T11:43:50.547 回答
2

您也可以在带有 GUI 界面的 codeplex 中使用 ilmergertool

于 2012-05-07T10:51:33.650 回答
2

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

下面是一个非常简单的方法,我已经成功地构建了我的应用程序.NET framework 4.6.1

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

    Install-Package ilmerge
    
  2. 确认您已下载它。现在安装(不确定此命令,但只需转到您的 nuget 包): 在此处输入图像描述 注意:如果您有多个解决方案,您可能只需要为您的一个解决方案安装它

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

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

    在此处输入图像描述

  4. 现在这是可执行文件,您可以将其复制到您的\bin\Debug(或构建您的应用程序的任何地方),然后在命令行/powershell 中执行如下操作:

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

您现在将拥有一个新的可执行文件,其中包含所有库!

于 2017-07-15T16:12:20.113 回答
0

我回答了一个类似的问题VB.NET。然而,转换应该不会太难。您将其DLL's嵌入到您的Ressource文件夹中,并在第一次使用 AppDomain.CurrentDomain.AssemblyResolve时触发该事件。

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

将 DLL 嵌入到项目中

于 2012-04-13T09:11:04.630 回答
0

注意:如果您尝试加载非 ILOnly 程序集,则

Assembly.Load(block)

将不起作用,并且将引发异常: 更多详细信息

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

Assembly.LoadFile(dllFile)
于 2018-03-25T09:06:31.307 回答
0

我发现以下解决方案是 Stpes:-

  1. 下载 ILMerge.msi 并将其安装在您的计算机上。
  2. 打开命令提示符
  3. 键入 cd C:\Program Files (x86)\Microsoft\ILMerge 按下 Enter
  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

于 2018-05-03T13:53:07.383 回答
-2

该命令应该是以下脚本:

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
于 2017-02-02T10:52:34.520 回答