Две проблемы:
1) Базовая сборка .NET, не включенная в сборку ILMerged
У меня возникают проблемы с использованием ILMerge в моем пост-билде после обновления с .NET 3.5 / Visual Studio 2008 до .NET 4 / Visual Studio 2010. У меня есть решение с несколькими проектами, целевая структура которых установлена на ".NET Рамки 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);
}