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

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

1) Основной блок.NET, не включенный в блок ILMerged

Я испытываю затруднения с помощью ILMerge в моей постсборке после обновления от.NET 3.5/Visual Studio 2008 к.NET 4/Visual Studio 2010. У меня есть Решение с несколькими проектами, целевая платформа которых установлена на "Платформу.NET 4". Я использую следующую команду ILMerge для слияния отдельного DLLs проекта в единственный 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 4 проекта C#, однако, и пытаюсь использовать код в нем, я получаю соблюдающее предупреждение:

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

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

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

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

2) TypeLoadException только, когда Используя объединенный блок

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

Система. TypeLoadException: не Мог загрузить тип 'Система. 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, и когда я использую этого конструктора при ссылке на отдельный DLLs проекта, он хорошо работает. Только, когда я использую этого конструктора при ссылке на DLL IL-merged, я получаю исключение. Я не знаю то, что продолжается.

Вот то, что конструктор:

public Row(IEnumerable<string> keys) : base(keys) { }

И base к которому это относится, имеет этот код:

foreach (string key in keys.Where(
    key => !string.IsNullOrEmpty(key)
))
{
    _dic.Add(key, string.Empty);
}
51
задан starblue 4 June 2010 в 05:07
поделиться

1 ответ

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


Дополнение. Есть что-то очень, очень неправильное в вашем /lib: "C:\Windows\Microsoft.NET\Framework64\v4.0.30319" варианте. В последнее время, после выхода .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"

Настройте в соответствии с вашей конкретной машиной и целевой версией фреймворка.

48
ответ дан 7 November 2019 в 10:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: