2014-02-12 2 views
7

Мне очень сложно связать все мои зависимости в моем проекте C# WPF в один exe, используя SmartAssembly 6 (оценка/пробный) из-за MahApps.Metro.Как связать MahApps.Metro с одним 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). Я пробовал все виды вариаций, когда я удалил dll System.Windows.Interactivity, добавил его, переместил его на другой путь и т. Д.

Использование последнего пакета MahApps.Metro от NuGet и .NET 4.5. Программа работает, когда я запускаю ее из Visual Studio 2012 или когда я запускаю приложение из Debug/Release.

Неужели кто-нибудь сталкивался с этой проблемой раньше? Как вы это разрешили? Является ли проблема приложением пакета (SmartAssembly 6) или MahApps.Metro? Существуют ли какие-либо другие программы, которые вы знаете или думаете, будут работать с MahApps.Metro?

ответ

8

вот мой способ поставить DLLs в один ехе

1) создать папку с именем DllsAsResource и поставить MahApps.Metro.dll и System.Windows.Interactivity.dll с Add as Link к нему

2) изменить Build Action для библиотек DLL для 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) Теперь у вас есть один ех без публикации в отверстии DLLS

вы можете посмотреть при этом demo для всех кончиков

надежда, что помогает

+0

спасибо за ответ на это! Через несколько дней, пытаясь объединить его без каких-либо успехов, я сдался, но я обязательно попробую и постараюсь отметить это как ответ, если/когда он работает :) – user1021726

+0

Извините за такой поздний ответ (не успел для реализации этого). Но это отлично работает! Большое спасибо! :) – user1021726

+0

Вы проверяете, не слишком ли страдает время загрузки приложения? – MuiBienCarlota

Смежные вопросы