【问题标题】:How to bundle MahApps.Metro into single exe如何将 MahApps.Metro 捆绑到单个 exe 中
【发布时间】:2014-02-12 10:37:29
【问题描述】:

由于 MahApps.Metro,我很难使用 SmartAssembly 6(评估/试用)将我在 C# WPF 项目中的所有依赖项捆绑到单个 exe 中。

这个结论是在创建一个只有 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 一起使用?

【问题讨论】:

    标签: c# wpf mahapps.metro smartassembly


    【解决方案1】:

    这是我将 dll 放入单个 exe 的方法

    1) 创建一个名为DllsAsResource 的文件夹并将MahApps.Metro.dllSystem.Windows.Interactivity.dllAdd as Link 放入其中

    2) 将 dll 的 Build Action 更改为 Embedded Resource

    3) 将Copy Local 更改为false 用于正常引用的dll

    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) 现在你有一个单独的 exe,而无需发布漏洞 dll

    您可以查看demo 了解所有提示

    希望对你有帮助

    【讨论】:

    • 感谢您回答这个问题!在尝试捆绑它几天但没有任何成功后,我放弃了,但我肯定会尝试一下并将其标记为答案,如果/何时有效:)
    • 抱歉这么晚回复(还没有时间来实现这个)。但这很好用!非常感谢! :)
    • 您是否检查过应用程序的加载时间是否受到太大影响?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多