Две проблемы:
1) Основная сборка .NET не включена в сборку с ILMerged
У меня возникли проблемы с использованием ILMerge в моей пост-сборке после обновления с .NET 3.5/Visual Studio 2008 до .NET 4/Visual Studio 2010. У меня есть решение с несколькими проектами, чья целевая структура установлена на ".NET Рамки 4". Я использую следующую команду ILMerge для объединения отдельных DLL проектов в одну DLL:
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.NET С#, и пытаюсь использовать код внутри нее, я получаю следующее предупреждение:
Основная ссылка "MyILMergedDLL" не может быть решена, поскольку она имеет косвенную зависимость от сборки .NET Framework "mscorlib, Version = 4.0, Culture = neutral, PublicKeyToken = b77a5c561934e089", которая имеет более высокую версию "4.0.65535.65535", чем версия "4.0.0.0" в текущей целевой структуре.
Если я удаляю флаг /targetplatform:v4
и пытаюсь использовать MyILMergedDLL.dll, я получаю следующую ошибку:
Тип "System.Xml.Serialization.IXmlSerializable" определен в сборке, на которую не ссылаются. Вы должны добавить ссылку на сборку "System.Xml, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089".
Кажется, я не должен был этого делать. Тот, кто использует мой MyILMergedDLL.dll API, не должен добавлять ссылки на любые библиотеки, на которые он ссылается. Как я могу обойти это?
2) TypeLoadException только при использовании объединенной сборки
Изменить:, даже если я добавлю ссылку на System.Xml
в потребительский проект, в котором используется MyILMergedDLL.dll, использование некоторого кода в MyILMergedDLL.dll дает это исключение:
System.TypeLoadException: Не удалось загрузить тип 'System.Func`2' из сборки 'MyILMergedDLL, Version = 1.0.1.1, Culture = neutral, PublicKeyToken =...'.
Это код моего потребительского проекта; строка, которая вызвала TypeLoadException
, является второй:
var keys = new[] {"a", "b", "c"};
var row = new Row(keys);
Конкретный конструктор Row
, который выбрасывает TypeLoadException
, определяется в открытом классе в MyILMergedDLL
, и когда я использую этот конструктор при ссылке на отдельные DLL-проекты, он отлично работает. Только когда я использую этот конструктор при ссылке на объединенную DLL DL, я получаю исключение. Я не знаю, что происходит.
Здесь этот конструктор:
public Row(IEnumerable<string> keys) : base(keys) { }
И base
, к которому он обращается, имеет этот код:
foreach (string key in keys.Where(
key => !string.IsNullOrEmpty(key)
))
{
_dic.Add(key, string.Empty);
}