将DLL嵌入到已编译的可执行文件中

你知道,我在任何地方都没有看到很好的答案。 是否有可能将预先存在的DLL嵌入已编译的C#可执行文件(以便只有一个文件需要分发)? 如果可能的话,人们会怎么做呢?

通常情况下,我只是把DLL放在外面,让安装程序处理所有事情,但是有很多人问我这个问题,但我真的不知道。


我强烈建议使用Costura.Fody--迄今为止将资源嵌入到程序集中的最好和最简单的方法。 它以NuGet包的形式提供。

Install-Package Costura.Fody

将它添加到项目后,它会自动将所有复制到输出目录的引用嵌入到主程序集中。 您可能需要通过向项目添加目标来清除嵌入文件:

Install-CleanReferencesTarget

您还可以指定是否包含pdb,排除特定的程序集或实时提取程序集。 据我所知,还支持非托管程序集。

更新

目前,有些人正试图增加对DNX的支持。


如果它们实际上是托管的程序集,则可以使用ILMerge。 对于本机DLL,您需要做更多工作。

另请参阅:如何将C ++ windows dll合并到C#应用程序exe中?


只需在Visual Studio中右键单击您的项目,选择项目属性 - >资源 - >添加资源 - >添加现有文件...并将下面的代码包含到您的App.xaml.cs或同等版本中。

public App()
{
    AppDomain.CurrentDomain.AssemblyResolve +=new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll","");

    dllName = dllName.Replace(".", "_");

    if (dllName.EndsWith("_resources")) return null;

    System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());

    byte[] bytes = (byte[])rm.GetObject(dllName);

    return System.Reflection.Assembly.Load(bytes);
}

这是我原来的博客文章:http://codeblog.larsholm.net/2011/06/embed-dlls-easily-in-a-net-assembly/

链接地址: http://www.djcxy.com/p/26817.html

上一篇: Embedding DLLs in a compiled executable

下一篇: How do I push a local Git branch to master branch in the remote?