7

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.

私はこれを解決するために1日半を費やし、エラーをグーグルで調べ、見つけることができるすべての提案を試し、公式のMahApps.Metroチャット(https://gitter.im/MahApps/MahApps.Metro)に投稿しました。System.Windows.Interactivity dll を削除、追加、別のパスに移動するなど、あらゆる種類のバリエーションを試しました。

NuGet の最新の MahApps.Metro パッケージと .NET 4.5 を使用します。プログラムは、Visual Studio 2012 から実行した場合、またはアプリケーションをデバッグ/リリースから実行した場合に機能します。

以前にこの問題に遭遇した人はいますか? どのように解決しましたか?問題はバンドル アプリケーション (SmartAssembly 6) または MahApps.Metro にありますか? 他に、MahApps.Metro で動作することを知っている、または考えているバンドル プログラムはありますか?

4

1 に答える 1

8

これが、dllを単一のexeに入れる私の方法です

1) という名前のフォルダーを作成し、それに andをDllsAsResource付けますMahApps.Metro.dllSystem.Windows.Interactivity.dllAdd as Link

2)Build Actiondllのをに変更しますEmbedded Resource

3)通常参照される dll に変更Copy Localします。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 を公開せずに単一の exe ができました。

すべてのヒントについては、このデモを見ることができます

それが役立つことを願っています

于 2014-03-01T19:38:46.450 に答える