Серьезные проблемы с 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
Ответ 2
Вы можете попробовать Costura.
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"
Ответ 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 может помочь решить проблему.