当前位置:  开发笔记 > 编程语言 > 正文

使用wpf将dll合并为单个.exe

如何解决《使用wpf将dll合并为单个.exe》经验,为你挑选了6个好方法。

我目前正在开发一个我们有很多依赖项目的项目.我想将所有引用的dll编译成.exe,就像使用嵌入式资源一样.我已经尝试过ILMerge但它无法处理.xaml资源.

所以我的问题是:有没有办法将WPF项目与多个依赖项合并为一个.exe?



1> Wegged..:

http://www.digitallycreated.net/Blog/61/combining-multiple-assemblies-into-a-single-exe-for-a-wpf-application

这对我来说就像一个魅力:)它完全免费.

在博客消失的情况下添加代码.

1)将其添加到您的.csproj文件中:


  
    
      %(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)
    
  

2)让你的Main Program.cs看起来像这样:

[STAThreadAttribute]
public static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
    App.Main();
}

3)添加OnResolveAssembly方法:

private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
    Assembly executingAssembly = Assembly.GetExecutingAssembly();
    AssemblyName assemblyName = new AssemblyName(args.Name);

    var path = assemblyName.Name + ".dll";
    if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false) path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path);

    using (Stream stream = executingAssembly.GetManifestResourceStream(path))
    {
        if (stream == null) return null;

        var assemblyRawBytes = new byte[stream.Length];
        stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
        return Assembly.Load(assemblyRawBytes);
    }
}


非常简单!简而言之,只需要三个步骤:1.编辑.csproject并粘贴提供的行2.创建.cs文件,粘贴提供的行并自动解析丢失的程序集3.将启动对象更改为刚刚创建的文件.

2> Simon..:

Costura Fody是一个开源工具,旨在处理合并wpf程序集.

https://github.com/Fody/Costura#how-it-works


具体来说,它是您安装到项目中的Nu-Get包,它会导致wpf程序集合并而无需您进行任何进一步的干预.
整齐.当时绝对是最好的解决方案.还对大小进行了一些优化,它只占ILMerged exe大小的50%.
效果很好.安装Nuget并完成.
史诗般的nuget包!我实际上是在构建插件时使用它.它为我节省了一份工作语气!问题是,插件使用的是一些外部.dll,它不能出现在插件目录中,因为编写插件的应用程序试图将所有.dll加载为插件..简单完美..

3> Timotei..:

{smartassembly}就是这样一个产品.它可以阻止或嵌入你的dll.

试试这个:http://www.smartassembly.com/

您还可以对应用程序进行大量改进,以便更快地运行.

是的.您可以将它用于WPF.

更新2015年6月6日:ILRepack 2.0.0(ILMerge的开源替代品)现在支持大多数合并的WPF案例:https://twitter.com/Gluckies/status/607680149157462016



4> Matthieu..:

作为上公布ILMerge网站,把这些dll作为ressources,从杰弗里里希特这里:

许多应用程序由依赖于许多DLL文件的EXE文件组成.部署此应用程序时,必须部署所有文件.但是,有一种技术可用于部署单个EXE文件.首先,确定您的EXE文件所依赖的所有DLL文件,这些文件不作为Microsoft .NET Framework本身的一部分提供.然后将这些DLL添加到Visual Studio项目中.对于您添加的每个DLL文件,显示其属性并将其"构建操作"更改为"嵌入式资源".这会导致C#编译器将DLL文件嵌入到EXE文件中,您可以部署此一个EXE文件.在运行时,CLR将无法找到依赖的DLL程序集,这是一个问题.要解决此问题,请在应用程序初始化时,使用AppDomain的ResolveAssembly事件注册回调方法.代码看起来应该是这样的:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {

   String resourceName = "AssemblyLoadingAndReflection." +

      new AssemblyName(args.Name).Name + ".dll";

   using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {

      Byte[] assemblyData = new Byte[stream.Length];

      stream.Read(assemblyData, 0, assemblyData.Length);

      return Assembly.Load(assemblyData);

   }

}; 

现在,第一次线程调用引用依赖DLL文件中的类型的方法时,将引发AssemblyResolve事件,并且上面显示的回调代码将找到所需的嵌入式DLL资源,并通过调用Assembly的Load方法的重载来加载它.以Byte []为参数.



5> 小智..:

使用Costura.Fody - 它可以作为Nuget Pkg使用,以便在装配中嵌入资源的最佳和最简单的方法.

Install-Package Costura.Fody

将其添加到项目后,它会自动将所有添加的引用嵌入到主程序集中.



6> Hemant..:

.NET reactor具有合并组件的功能,并且不是非常昂贵.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有