Серьезные проблемы с ILMerge и .NET 4.0

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

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

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

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"

Любые мысли о том, что я делаю неправильно?

Ответ 1

Одно из предложений, которое я видел для объединения 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

Ответ 3

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

В качестве побочного примечания я попытался выполнить .NET Reactor из Eziriz, и он действительно отлично поработал, но стоит 180 долларов США, что для проект хобби, который я пока не собираюсь тратить. Но это намного дешевле, чем другая коммерческая альтернатива от Красных ворот, и поэтому я подумал, что упомянул об этом.

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

Ответ 4

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

Я использую его для объединения в Rx System.Reactive.dll, который имеет ссылку на Dispatcher, но не имеет реальных ресурсов WPF.

Ответ 5

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

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

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