将DLL合并到EXE中?

时间:2012-04-13 08:55:26

标签: c# dll merge ilmerge

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

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

14 个答案:

答案 0 :(得分:83)

对于.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.exefinish.exe替换为您想要的任何文件名。
  4. /out:finish.exe后面你必须提供你想要的文件 组合。

答案 1 :(得分:25)

下载ilmergeilmergre gui。使加入文件变得如此简单 香港专业教育学院使用这些并且工作得很好

答案 2 :(得分:16)

将DLL引用到您的Resources,并使用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;
        };
    }
}

答案 3 :(得分:16)

使用Costura.Fody

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

答案 4 :(得分:10)

下载

ILMerge

呼叫

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

答案 5 :(得分:8)

  1. Install ILMerge 正如其他主题告诉你的那样

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

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

  4. 按住Shift键并右键单击该文件夹,然后选择打开命令提示符

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

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

  6. 你有合并的exe。如果你去的话,这可能不是最好的方式 多次这样做,但是最简单的一次使用,我愿意 建议把Ilmerge放在你的路上。

答案 6 :(得分:5)

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添加到项目资源中。添加文件夹“资源”

答案 7 :(得分:2)

此外,您可以在带有GUI界面的codeplex中使用ilmergertool

答案 8 :(得分:0)

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

如果您想在开发期间引用它,只需为项目添加正常的DLL引用。

Embedd a DLL into a project

答案 9 :(得分:0)

这是official documentation。这也会在第2步自动下载。

以下是一种非常简单的方法,我使用.NET framework 4.6.1

成功构建了我的应用
  1. 通过gui或命令行安装ILMerge nuget包:

    Install-Package ilmerge
    
  2. 确认您已下载。现在安装(不确定命令,但只是去你的nuget包): enter image description here 注意:如果您有多个

  3. ,您可能只需为其中一个解决方案安装它
  4. 导航到您的解决方案文件夹,在packages文件夹中,您应该看到&#39; ILMerge&#39;可执行文件:

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

    enter image description here

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

    ILMerge.exe myExecutable.exe myDll1.dll myDll2.dll myDlln.dll myNEWExecutable.exe
    
  6. 现在,您将拥有一个新的可执行文件,其中包含所有库!

答案 10 :(得分:0)

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

Assembly.Load(block)

将无效,将抛出异常: more details

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

克服了这个问题
Assembly.LoadFile(dllFile)

答案 11 :(得分:0)

我找到了解决方案以下是Stpes: -

  1. 下载ILMerge.msi并将其安装到您的计算机上。
  2. 打开命令提示符
  3. 键入cd C:\ Program Files(x86)\ Microsoft \ ILMerge Preess Enter
  4. C:\ Program Files(x86)\ Microsoft \ ILMerge&gt; ILMerge.exe / target:winexe /targetplatform:"v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319“ /out:NewExeName.exe SourceExeName.exe DllName.dll
  5. 对于多个Dll: -

    C:\ Program Files(x86)\ Microsoft \ ILMerge&gt; 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

答案 12 :(得分:0)

2019更新(仅供参考):

.NET Core 3.0 开始,out of the box支持此功能。要利用单文件可执行文件发布的优势,只需将以下行添加到项目配置文件中:

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

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

有关此功能的更多文档,请访问https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md

答案 13 :(得分:-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