использование 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);
}

Ответы на вопрос(1)

Ваш ответ на вопрос