如何将MahApps.Metro打包成单个exe文件

7
我在使用SmartAssembly 6 (评估/试用版)将我的C# WPF项目中的所有依赖项打包成单个exe时遇到了很大的困难,因为其中涉及到了MahApps.Metro。
这个结论是在创建一个完全空白的项目,只有MahApps.Metro的情况下得出的,但仍然无法打包。
它抛出了一个内部异常System.IO.FileNotFoundException: Could not load file or assembly 'System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. 我花了一天半的时间来解决这个问题,在谷歌上搜索错误信息,尝试每一个我能找到的建议,并在官方的MahApps.Metro聊天室https://gitter.im/MahApps/MahApps.Metro发布了帖子。我尝试了许多不同的变化,例如移除System.Windows.Interactivity dll,添加它,将它移到另一个路径等。
使用最新的NuGet MahApps.Metro包和.NET 4.5。当我从Visual Studio 2012运行它或从Debug/Release运行应用程序时,程序可以正常工作。

有人遇到过这个问题吗?你是如何解决的?是捆绑应用程序(SmartAssembly 6)还是MahApps.Metro的问题?你知道或认为还有其他捆绑程序可以与MahApps.Metro一起使用吗?

1个回答

8
这里是将dll文件放入单个exe文件的方法:
1)创建一个名为“DllsAsResource”的文件夹,并使用“添加为链接”方式将“MahApps.Metro.dll”和“System.Windows.Interactivity.dll”放入其中。
2)将这些dll文件的“生成操作”更改为“嵌入的资源”。
3)对于普通引用的dll文件,将“复制本地”更改为“false”。
4)创建Program.cs文件。
using System;
using System.Reflection;

namespace MahApps.Metro.Simple.Demo
{
  public class Program
  {
    [STAThread]
    public static void Main()
    {
      AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
        var resourceName = Assembly.GetExecutingAssembly().GetName().Name + ".DllsAsResource." + new AssemblyName(args.Name).Name + ".dll";
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
          if (stream != null) {
            var assemblyData = new Byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            return Assembly.Load(assemblyData);
          }
        }
        return null;
      };

      App.Main();
    }
  }
}

5) 将项目属性中的 Startup object 设置为 Program.cs

6) 现在你有了一个单独的可执行文件,而不需要发布所有的dll文件

你可以查看这个演示来获取所有的提示

希望能对你有所帮助


谢谢您的回答!我试了几天,但一直没有成功地打包它,所以我放弃了。但如果/当它起作用时,我一定会尝试并将其标记为答案 :) - user1021726
非常抱歉回复晚了(一直没有时间去实现)。但这个很棒!谢谢!:) - user1021726
你有检查过应用程序的加载时间是否受到太大影响吗? - MuiBienCarlota

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接