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

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

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

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

ilmerge.exe /out:C:UsersLoganDevelopmentProjectsOrangeNoteOrangeNotebinReleaseOrangeNote.exe 
  /ndebug /targetplatform:v4,C:WindowsMicrosoft.NETFrameworkv4.0.30319 
  /lib:"C:WindowsMicrosoft.NETFrameworkv4.0.30319" 
  /lib:"C:Program FilesMicrosoft Visual Studio 10.0Common7IDEPublicAssemblies" 
  "C:UsersLoganDevelopmentProjectsOrangeNoteOrangeNoteobjReleaseOrangeNote.exe" 
  "C:UsersLoganDevelopmentProjectsOrangeNoteOrangeNote......LibrariesLucene.NetsrcLucene.NetbinReleaseLucene.Net.dll" 
  "C:UsersLoganDevelopmentProjectsOrangeNoteOrangeNote......LibrariesOokii.DialogssrcOokii.Dialogs.WpfbinReleaseOokii.Dialogs.Wpf.dll" 
  "C:UsersLoganDevelopmentProjectsOrangeNoteOrangeNote......LibrariesSharpZipLibbinICSharpCode.SharpZipLib.dll" 
  "C:UsersLoganDocumentsVisual Studio 2010ProjectsHumanInterfaceProjectHumanInterfaceProjectbinReleaseHipLib.dll"

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

5 ответов


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


вы можете попробовать Costura.

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

Это в основном занимает Джеффри Рихтерс appraoch

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

но делает это таким образом, что вам не нужно писать никакого кода. т. е. вам не нужно писать метод "AssemblyResolve"


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

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

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


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

Я использую это для слияния в системе Rx.Реактивный.DLL, которая имеет ссылку на Dispatcher, но не имеет никаких фактических ресурсов WPF.


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

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

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