2013-11-01 5 views
4

у меня есть такие выходные файлы моего приложения WPF:Как объединить файлы в единый исполняемый файл или уменьшить количество распространяемых файлов

de\ 
es\ 
fr\ 
hu\ 
it\ 
pt-BR\ 
Resources\ 
ro\ 
ru\ 
sv\ 
zh-Hans\ 
FileHelpers.dll 
FileHelpers.DataLink.dll 
FileHelpers.ExcelStorage.dll 
Interop.Excel.dll 
Interop.Office.dll 
Ionic.Zip.dll 
wpftoolkit.dll 
Xceed.Wpf.AvalonDock.dll 
Xceed.Wpf.AvalonDock.Themes.Aero.dll 
Xceed.Wpf.AvalonDock.Themes.Metro.dll 
Xceed.Wpf.AvalonDock.Themes.VS2010.dll 
Xceed.Wpf.DataGrid.dll 
Xceed.Wpf.Toolkit.dll 
MyApp.Common.Extensions.dll 
MyApp.Common.Helpers.dll 
MyApp.Common.Types.Attributes.dll 
MyApp.Security.dll 
MyApp.Wpf.Controls.dll 
MyApp.exe 
MyApp.exe.config 
licence.key 
error.log 

Все началось с MyApp развивается сама, все остальное сделано 3dParty I хочу распространять мое приложение, но для этого я хочу объединить все, что можно распределить по минимальному количеству файлов.

Я пытался использовать ILMerge, чтобы объединить мои файлы на одном одном, но получаю сообщение об ошибке:

ILMerge.Merge: ERROR!!: Duplicate type 'XamlGeneratedNamespace.GeneratedInternal TypeHelper' found in assembly 'Xceed.Wpf.DataGrid'. Ответ на этот вопрос я нашел здесь xeed error reason Чем я быть чтение ilmerge limitations и assembly as resources by Jeffrey Richter

Итак, я нашел решение Джеффри Рихтера весьма полезным. Но я не могу применить это для своей программы, потому что на сборках нет атрибута «Build Action».

Что я могу сделать для достижения своей цели?

enter image description here

+0

Просто из любопытства, почему вы хотите свести к минимуму количество файлов? Это просто не похоже на очень продуктивное использование вашего времени. –

+0

@ Мики Динеску, он, возможно, вы правы, но я хочу понять, почему идея Джеффри не работает для меня. – sreginogemoh

ответ

2

Взгляните на SmartAssembly RedGate в.

+0

Хе-хе, я попробую это, но я все еще удивляюсь, почему подход Джеффри не работает в моем случае. – sreginogemoh

7

Чтобы идея Джеффри работала, вы должны добавить свои сборки не только в качестве ссылок. Просто добавьте DLL как существующий элемент (щелкните правой кнопкой мыши по проекту-> Добавить-> Существующий элемент) в свой проект, и вы получите Build Action собственность на них. Также установите Скопируйте локальное свойство на false по ссылкам, которые вы добавляете в качестве встроенного ресурса.

enter image description here

App конструктор класса:

public partial class App : Application 
{ 
    public App() 
    { 
     AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 
    } 
    static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var dllName = new AssemblyName(args.Name).Name + ".dll"; 
     var execAsm = Assembly.GetExecutingAssembly(); 
     var resourceName = execAsm.GetManifestResourceNames().FirstOrDefault(s => s.EndsWith(dllName)); 
     if (resourceName == null) return null; 
     using (var stream = execAsm.GetManifestResourceStream(resourceName)) 
     { 
      var assbebmlyBytes = new byte[stream.Length]; 
      stream.Read(assbebmlyBytes, 0, assbebmlyBytes.Length); 
      return Assembly.Load(assbebmlyBytes); 
     } 

    } 
} 

Обратите внимание, что этот метод потребляет больше памяти, чем обычно дллы нагрузки.

+0

Отлично, а также будет использовать «SmartAssembly» RedGate, поскольку предложенный @gap – sreginogemoh

+0

Как это влияет на список ссылочных ассемблеров под папка с ссылками? Это влияет на время компиляции или время выполнения? Я действительно увлекаюсь проверкой этого, не понял, как все это работает? – IbrarMumtaz

+0

У вас должны быть ссылки на все сборки, как в обычной ситуации, чтобы предоставить всю необходимую информацию о типах компилятору. Вы устанавливаете Copy local в false, потому что все сборки (которые не находятся в GAC) загружаются из ресурсов во время выполнения. Это происходит, когда CLR встречает типы из этих Dlls в первый раз и вызывает компиляцию JIT. Из-за этого вы не можете использовать такие типы непосредственно в Main(). – Deffiss