использование ILMerge с библиотеками .NET 4
Две проблемы:
1) Базовая сборка .NET, не включенная в сборку ILMerged
У меня возникают проблемы с использованием ILMerge в моем пост-билде после обновления с .NET 3.5 / Visual Studio 2008 до .NET 4 / Visual Studio 2010. У меня есть решение с несколькими проектами, целевая структура которых установлена на ".NET Framework 4" , Я использую следующую команду ILMerge для объединения отдельных библиотек проекта в одну библиотеку:
if not $(ConfigurationName) == Debug
if exist "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
/lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
/lib:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies"
/keyfile:"$(SolutionDir)$(SolutionName).snk"
/targetplatform:v4
/out:"$(SolutionDir)bin\development\$(SolutionName).dll"
"$(SolutionDir)Connection\$(OutDir)Connection.dll"
...other project DLLs...
/xmldocs
Если я не буду указывать расположение каталога платформы .NET 4, я получаю сообщение об ошибке «Неразрешенная ссылка на сборку не разрешена: система» от ILMerge. Если я остановлюсь, указав расположение каталога MSTest, я получу ошибку «Неразрешенная ссылка на сборку не разрешена: Microsoft.VisualStudio.QualityTools.UnitTestFramework».
Приведенная выше команда ILMerge работает и создает DLL. Однако, когда я ссылаюсь на эту DLL в другом проекте .NET 4 C # и пытаюсь использовать код внутри нее, я получаю следующее предупреждение:
Первичная ссылка «MyILMergedDLL» не может быть разрешена, поскольку она имеет косвенную зависимость от сборки .NET Framework «mscorlib, Version = 4.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089», версия которого выше «4.0.65535.65535», чем версия «4.0.0.0» в текущей целевой структуре.
Если я тогда уберу/targetplatform:v4
флаг и попробуйте использовать MyILMergedDLL.dll, я получаю следующую ошибку:
Тип 'System.Xml.Serialization.IXmlSerializable' определяется в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку «System.Xml, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089».
Не похоже, что мне нужно это делать. Тот, кто использует мой API MyILMergedDLL.dll, не должен добавлять ссылки на библиотеки, на которые он ссылается. Как я могу обойти это?
2) TypeLoadException только при использовании объединенной сборки
Редактировать: помимо этого, даже если я добавлю ссылку наSystem.Xml
в потребительском проекте, который использует MyILMergedDLL.dll, использование некоторого кода в MyILMergedDLL.dll дает следующее исключение:
System.TypeLoadException: не удалось загрузить тип 'System.Func`2' из сборки 'MyILMergedDLL, версия = 1.0.1.1, культура = нейтральная, PublicKeyToken = ...'.
Это код в моем потребительском проекте; линия, которая вызвалаTypeLoadException
это второй:
var keys = new[] {"a", "b", "c"};
var row = new Row(keys);
КонкретныйRow
конструктор, который бросаетTypeLoadException
определяется в публичном классе вMyILMergedDLL
и когда я использую этот конструктор при обращении к отдельным библиотекам проекта, он работает нормально. Исключение составляет только когда я использую этот конструктор при обращении к слитой в DLL библиотеке. Я не знаю, что происходит.
Вот этот конструктор:
public Row(IEnumerable<string> keys) : base(keys) { }
Иbase
на который он ссылается, имеет такой код:
foreach (string key in keys.Where(
key => !string.IsNullOrEmpty(key)
))
{
_dic.Add(key, string.Empty);
}