2010-07-30 2 views
10

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

Я пробовал this и this безрезультатно. Я даже не могу его построить, если не использовать файл конфигурации, но когда я это делаю, это не сработает. Без конфигурационного файла я последовательно получаю сообщение об ошибке «Не разрешенная ссылка на сборку не допускается: 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" 

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

+4

Я разрешаю это просто: /lib:"C:\Windows\Microsoft.NET ||Framework64\v4.0.30319\WPF " –

ответ

8

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

+0

Это замечательно, спасибо! Даже Майк Барнетт (автор ILMerge) считает, что это решение, поэтому для меня это достаточно хорошо. :) – devios1

+1

Обратите внимание, что это делает невозможным Ngen файлы dll. – Peter

+0

Это не работает для библиотек классов: прокрутите вниз, чтобы увидеть комментарий Джеффри Ритчера об этом в ссылке в ответе, комментарий от 28 июля 2010 года 3:14 вечера. – Dean

3

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

Здесь мало информации, но this forum post упоминает о возможном решении, и есть несколько возможностей, упомянутых на answers to this question, но самое высокое голосование - это просто покупка коммерческой альтернативы - я не знаю, это возможность для вас.

Существует discussion here, который объясняет, почему он не работает, и есть предложение here that changing the resource reference in the xaml may help solve the problem.

+0

Я не верю, что есть на самом деле любые ресурсы WPF в этой сборке, но я не совсем уверен (проверю, когда я вернусь домой). Конечно, мой главный исполняемый файл, но это не проблема. Тем не менее я буду смотреть на это дальше. Спасибо за ответ. – devios1

7

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

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

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

+0

Хорошая информация. Спасибо за ответ. –

+0

Как коммерческий пользователь .NET Reactor, я должен упомянуть, что мне всегда не удалось объединить сборки. Он, похоже, успешно слился, но когда вы запускаете объединенное приложение, вы встретите странные действия. – Ying

+0

Казалось, он отлично работает, когда я застрял * просто * на встраивание (не слияние) и вообще ничего необычного. Я сделал прогон своей программы, и все казалось нетронутым. – devios1

6

Хотя это правда, что 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.

8

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

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

Это в основном берет Джеффри Richters appraoch

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

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

+0

Кажется, что у вас сломанная ссылка. Но Costura теперь представляет собой пакет NuGet в качестве дополнения к Fody. http://www.nuget.org/packages/Costura.Fody/ – Corylulu

+1

@Corylulu исправлено – Simon

 Смежные вопросы

  • Нет связанных вопросов^_^