Серьезные проблемы с ILMerge и .NET 4.0 - PullRequest
10 голосов
/ 30 июля 2010

Мне кажется, что мое приложение .NET 4 не может правильно слиться с ILMerge. Даже после установки / targetplatform, / lib, / ndebug и добавления пользовательского файла ILMerge.exe.config выходной файл не работает должным образом (похоже, он не может "найти" объединенное библиотеки).

Я пробовал это и это безрезультатно. Я не могу даже заставить его строить, если я не использую файл конфигурации, но когда я делаю это, это не работает. Без файла конфигурации я последовательно получаю сообщение об ошибке « Неразрешенная ссылка на сборку не разрешена: PresentationFramework ».

Вот текущее состояние моей команды ILMerge, используемой в качестве события после сборки:

ilmerge.exe /out:C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\bin\Release\OrangeNote.exe 
  /ndebug /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
  /lib:"C:\Windows\Microsoft.NET\Framework\v4.0.30319" 
  /lib:"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\obj\Release\OrangeNote.exe" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Lucene.Net\src\Lucene.Net\bin\Release\Lucene.Net.dll" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Ookii.Dialogs\src\Ookii.Dialogs.Wpf\bin\Release\Ookii.Dialogs.Wpf.dll" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\SharpZipLib\bin\ICSharpCode.SharpZipLib.dll" 
  "C:\Users\Logan\Documents\Visual Studio 2010\Projects\HumanInterfaceProject\HumanInterfaceProject\bin\Release\HipLib.dll"

Есть мысли о том, что я делаю не так?

Ответы [ 5 ]

8 голосов
/ 11 августа 2011

Вы могли бы попробовать Костуру.

https://github.com/Fody/Costura#how-it-works

Это в основном требует оценки Джеффри Рихтерса

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

Но делает это в некотором родечто вам не нужно писать какой-либо код.т.е. вам не нужно писать метод AssemblyResolve

8 голосов
/ 03 февраля 2011

Одно из предложений, которое я видел для объединения .dll в WPF, - просто добавить dll в качестве встроенного ресурса в проект и затем программно загрузить dll в сборку.

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {

   String resourceName = "AssemblyLoadingAndReflection." +

      new AssemblyName(args.Name).Name + ".dll";

   using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {

      Byte[] assemblyData = new Byte[stream.Length];

      stream.Read(assemblyData, 0, assemblyData.Length);

      return Assembly.Load(assemblyData);

   }

};

см: http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

7 голосов
/ 05 августа 2010

Я написал по электронной почте Майку Барнетту, автору ILMerge, и он объяснил, что он вообще не предназначен для работы с приложениями WPF, к сожалению, и был удивлен, когда сказал ему, что он работает с моим приложением WPF 3.5. Поскольку это не поддерживается, я просто покажу это и подожду, пока не появится другая альтернатива.

В качестве примечания я попробовал .NET Reactor из Eziriz , и он на самом деле работал отлично, но стоит 180 долларов, что на хобби-проект я пока не собираюсь тратить. Но это намного дешевле, чем другая коммерческая альтернатива от Red Gate, и я подумал, что упомяну это.

Обновление: Майк Барнетт теперь считает принятый ответ на этот вопрос лучшим решением. По его словам, если бы он знал, что это возможно, он никогда бы не написал ILMerge.

6 голосов
/ 16 сентября 2010

Хотя верно, что ILMerge не обновляет строки ресурсов WPF, его можно использовать для объединения сборок с ссылками WPF, передав каталог справочной сборки вместо каталога среды выполнения в /targetplatform, как таковой.: /targetplatform:v4,"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client" (для профиля клиента .NET 4.0).

Я использую это для слияния в Rx's System.Reactive.dll, который имеет ссылку на Dispatcher, но не имеет никакого фактического WPFресурсы.

3 голосов
/ 30 июля 2010

Я заметил, что одна твоя твоя сборка называется "dialogs.wpf". В настоящее время ILMerge неправильно объединяет сборки с ресурсами WPF в них.

По этому вопросу не так много информации, но в этом сообщении на форуме упоминает возможное решение, и есть несколько вариантов, упомянутых в ответах на этот вопрос , но проголосовал самый высокий предложение просто купить коммерческую альтернативу - я не знаю, есть ли такая возможность для вас.

Здесь есть обсуждение , объясняющее, почему оно не работает, и здесь есть предложение , что изменение ссылки на ресурс в xaml может помочь решить проблему .

...