Серьезные проблемы с 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);
}
};
вы можете попробовать Costura.
https://github.com/Fody/Costura#how-it-works
Это в основном занимает Джеффри Рихтерс appraoch
но делает это таким образом, что вам не нужно писать никакого кода. т. е. вам не нужно писать метод "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 может помочь решить проблему.