использование ILMerge with.NET 4 библиотеки



две проблемы:



1) базовая сборка .NET, не включенная в сборку ILMerged



у меня возникли проблемы с использованием ILMerge в моей пост-сборки после обновления с .NET 3.5/Visual Studio 2008 до .NET 4/Visual Studio 2010. У меня есть решение с несколькими проектами, целевая платформа которых установлена на ".NET Framework 4". Я использую следующую команду ILMerge для объединения отдельных DLL проекта в одну DLL:



if not $(ConfigurationName) == Debug
if exist "C:Program Files (x86)MicrosoftILMergeILMerge.exe"
"C:Program Files (x86)MicrosoftILMergeILMerge.exe"
/lib:"C:WindowsMicrosoft.NETFramework64v4.0.30319"
/lib:"C:Program Files (x86)Microsoft Visual Studio 10.0Common7IDEPublicAssemblies"
/keyfile:"$(SolutionDir)$(SolutionName).snk"
/targetplatform:v4
/out:"$(SolutionDir)bindevelopment$(SolutionName).dll"
"$(SolutionDir)Connection$(OutDir)Connection.dll"
...other project DLLs...
/xmldocs


если я уйду при указании местоположения каталога .NET 4 framework я получаю ошибку" неразрешенная ссылка на сборку не разрешена: System " от ILMerge. Если я перестану указывать местоположение каталога MSTest, я получу "неразрешенная ссылка на сборку не разрешена: Microsoft.VisualStudio.QualityTools.Ошибка "UnitTestFramework".



команда ILMerge выше работает и создает DLL. Однако, когда я ссылаюсь на эту DLL в другом проекте .NET 4 C# и пытаюсь использовать в нем код, я получаю следующее предупреждение:




не удалось разрешить основную ссылку "MyILMergedDLL", поскольку она имеет косвенную зависимость от сборки .NET Framework" mscorlib, Version=4.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", которая имеет более высокую версию" 4.0.65535.65535", чем версия" 4.0.0.0 " в текущей целевой платформе.




если я удалить /targetplatform:v4 флаг и попробуйте использовать MyILMergedDLL.dll, я получаю следующее ошибка:




тип ' система.XML.Сериализация.IXmlSerializable ' определяется в сборке, на которую нет ссылки. Необходимо добавить ссылку на систему сборки.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.




не похоже, что я должен это делать. Тот, кто использует мой MyILMergedDLL.DLL API не должен добавлять ссылки на любые библиотеки, на которые он ссылается. Как я могу обойти это?



2) TypeLoadException Только При Использовании Объединенной Сборки



Edit: помимо этого, даже если я добавить ссылку System.Xml в потребительском проекте, который использует MyILMergedDLL.dll, используя некоторый код в MyILMergedDLL.dll дает это исключение:




675   6  

6 ответов:

было совсем недавний выпуск для решения проблем x64. Свяжитесь с Майком Барнеттом напрямую, если у вас все еще есть проблемы (mbarnett at microsoft точка com)


дополнения. Есть что-то очень, очень неправильно о . Это было получить много программистов в беде в последнее время, после того, как .NET 4.5 был выпущен. Этот каталог не правильный для справочных сборок .NET 4.0. Его содержимое перезаписывается с помощью сборок 4.5, вы больше не можете использовать его для целевой установки .NET 4.0. Ошибка выполнения, которую вы получаете, очень неудобна, программа больше не может найти определенные типы. Обычно бомбардировка на атрибуте [Extension], иногда на интерфейсе ICommand.

эти и некоторые другие типы были перемещены из одной сборки в другую. Использование правильных опорных сборок является жестким требованием. Ты должны использование:

 /lib:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"

отрегулируйте, чтобы соответствовать вашей конкретной машине и целевой версии фреймворка.

вот это "после построения строки" для Visual Studio 2010 с пакетом обновления 1, используя .Net версии 4.0. Я строю консоль .exe со всеми суб-.dll файлы, включенные в него.

"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(SolutionDir)\deploy$(TargetFileName)" "$(TargetDir)$(TargetFileName)" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards

общие советы:

  • обратите внимание на каталог " \deploy\": вот где вывод.EXE-файл заканчивается.
  • обратите внимание на "каталог\ ILMerge". Я скопировал утилиту ILMerge в свой каталог решений (чтобы я мог распространять источник, не беспокоясь о нем документирование установки ILMerge).

дополнительные подсказки:

Если у вас есть проблемы с ним не работает, добавьте "Эхо" перед командой "Post Build". Затем откройте окно "вывод" в Visual Studio (View..Output) и проверьте точную команду, которую фактически сгенерировала Visual Studio. В моем конкретном случае, точная команда была:

"T:\PhiEngine\CSharp\ILMerge\ILMerge.exe" /out:"T:\PhiEngine\CSharp\Server Side\deploy\NfServiceDataHod.History.exe" "T:\PhiEngine\CSharp\Server Side\NfServiceDataHod\bin\Debug\NfServiceDataHod.History.exe" "T:\PhiEngine\CSharp\Server Side\NfServiceDataHod\bin\Debug\*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards

обновление

добавил Это к моему шагу "Post Build", он заменяет все .исполняемый. + dll файлы с одной комбинированной .исполняемый. Он также сохраняет отладку .файл pdb нетронутыми:

rem Create a single .exe that combines the root .exe and all subassemblies.
"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards
rem Remove all subassemblies.
del *.dll
rem Remove all .pdb files (except the new, combined pdb we just created).
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).all.pdb.temp"
del *.pdb
ren "$(TargetDir)$(TargetName).all.pdb.temp" "$(TargetName).all.pdb"
rem Delete the original, non-combined .exe.
del "$(TargetDir)$(TargetName).exe"
rem Rename the combined .exe and .pdb to the original name we started with.
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).pdb"
ren "$(TargetDir)$(TargetName).all.exe" "$(TargetName).exe"
exit 0

другие альтернативы:

вы также можете добавить файл config со следующим:

<?xml version ="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
  </startup>
</configuration>

принято от здесь

просто установите ссылки PresentationCore и PresentationFramework, чтобы иметь "Copy Local = True" в окне свойств Visual Studio (после выбора ссылок в обозревателе решений). Это решит проблему без жесткого кодирования пути фреймворка. Я предпочитаю это решение, потому что путь отличается в зависимости от того, является ли сервер разработчика/сборки 64-битным или 32-битным и неизбежно изменится по мере выпуска новых версий .NET/VS.

для тех, кто использует ILMerge из задач сообщества in .csproj:

<ILMerge InputAssemblies="@(MergeAssemblies)"
         ...
         TargetPlatformVersion="v4"
         TargetPlatformDirectory="$(ProgramFiles)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
/>

у нас есть смешанный парк агентов сборки CI, поэтому мы используем переменную среды $(ProgramFiles) для указания правильного пути (диск + папка x86/x64), как это было рекомендовано Команда MSBuild.

Comments

    Ничего не найдено.