ILMerge не может объединиться: сборка 'xxx' была объединена неправильно - PullRequest
0 голосов
/ 07 февраля 2019

Проблема

Использование ILMerge Я пытаюсь объединить три сборки: A, B и C. Не удается со следующим сообщением об ошибке.Мне действительно нужно помочь решить эту проблему.

"ILMerge.Merge: сборка 'B' не была правильно объединена. Она все еще указана в качестве внешней ссылки в целевой сборке."

Сборка A не ссылается на два других.B ссылки A. C ссылки A и B.

Командная строка: ilmerge / v2 / target: library /out:test.dll a.dll b.dll c.dll

Что у меня естьпробовал

  • Использовать / закрывать аргумент.Не имеет никакого значения.
  • Различные версии ILMerge, я получаю одинаковую ошибку как с версиями 3.0.21.3911, так и с 2.14.1208.
  • Сначала объединяем A и B и объединяем в C сслияние А + БЭто не выдает никакого сообщения об ошибке, но полученный файл поврежден.Он не запускается, и когда я запускаю через .NET Obfuscator, он жалуется на это.

Некоторый фон

Проект больше, чем три сборки, но мне удалось уменьшитьпроблема до этих.Если я не включаю сборку C и объединяю только A и B., проблема исчезает.

В предыдущей версии у меня не было этой проблемы.Между этими двумя версиями есть только нефункциональные изменения, такие как переименования (не сборки или пространства имен, только классы, методы и т. Д.) И переупорядочение модификаторов доступа (статические внутренние-> внутренние статические)

Из документации

Распространенная проблема заключается в том, что после объединения некоторых сборок появляется сообщение об ошибке, в котором говорится, что входная сборка не была объединена правильно, поскольку она все еще указана в качестве внешней ссылки в объединенной сборке.Наиболее распространенной причиной этой проблемы является то, что одна из входных сборок, B, имеет внешнюю ссылку на неправильно объединенную сборку A, а также внешнюю ссылку на другую сборку C, которая сама имеет внешнюю ссылку на A. Предположим, чтоссылка на C относится к методу, который принимает аргумент, тип которого определен в A. Тогда сигнатура типа вызова метода для метода в C по-прежнему ссылается на тип из A даже в объединенной сборке.В конце концов, ILMerge не может перейти и изменить сборку C, чтобы она теперь зависела от типа, как он определен в выходной сборке после объединения!Решение состоит в том, чтобы использовать закрытый параметр (раздел 2.6), чтобы ILMerge вычислял транзитивное замыкание входных сборок, чтобы предотвратить этот вид «свисающей ссылки».В этом примере это приведет к объединению всех трех сборок A, B и C.Невозможно объединить только A и B без внешней ссылки на A.

...