ILMerge игнорирует привязкуRedirect

У меня есть проект A, который ссылается на сборку B и сборку C. Сборка B также ссылается на сборку C, но в другой версии, чем в проекте A. На обе сборки (B и C) ссылаются в проекте A через NuGet (хотя обе сборки находятся под мой собственный контроль, поэтому я мог бы изменить способ их построения, если мне нужно) Я надеюсь, что эта картинка может проиллюстрировать, что я имею в виду: Иерархия сборки:

введите здесь описание изображения

В рамках проекта A у меня есть app.config, в котором есть bindRedirect на сборке C, чтобы указать все версии от 0.0.0.0 до 1.1.0.0 до версии 1.1.0.0:

<dependentAssembly>
    <assemblyIdentity name="C" publicKeyToken="447cd79fe2efd739" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
  </dependentAssembly>

Все сборки (B и C) подписаны и имеют строгое имя. Если я создаю проект, все работает нормально, так как Visual Studio рассматривает привязкуRedirect и всегда указывает на версию 1.1.0.0 сборки C. Однако, если я попытаюсь ILMerge вывод проекта A (что тоже является сборкой) с сборки B (1.0) и сборки C (1.1) я получаю следующую ошибку:

There was an error merging the assemblies: 
An exception occurred during merging:
Unresolved assembly reference not allowed: C.
   bei System.Compiler.Ir2md.GetAssemblyRefIndex(AssemblyNode assembly)
   bei System.Compiler.Ir2md.GetTypeRefIndex(TypeNode type)
   bei System.Compiler.Ir2md.VisitReferencedType(TypeNode type)
   bei System.Compiler.Ir2md.VisitMethod(Method method)
   bei System.Compiler.Ir2md.VisitClass(Class Class)
   bei System.Compiler.Ir2md.VisitModule(Module module)
   bei System.Compiler.Ir2md.SetupMetadataWriter(String debugSymbolsLocation)
   bei System.Compiler.Ir2md.WritePE(Module module, String debugSymbolsLocation, BinaryWriter writer)
   bei System.Compiler.Writer.WritePE(String location, Boolean writeDebugSymbols, Module module, Boolean delaySign, String keyFileName, String keyName)
   bei System.Compiler.Writer.WritePE(CompilerParameters compilerParameters, Module module)
   bei ILMerging.ILMerge.Merge()
   bei ILMerging.ILMerge.Main(String[] args)

Если я обновлю проект сборки B, чтобы он также указывал на версию 1.1 сборки C, все работает нормально, но это не то, чего я хочу добиться.

Итак, я думаю, проблема в том, что ILMerge не рассматривает app.config проекта A. Есть идеи, как решить эту проблему, не обновляя всегда все проекты в цепочке иерархии? Или любое предложение о том, что я делаю неправильно?


person DeeKay    schedule 04.02.2016    source источник
comment
Пока что единственное другое решение, которое я нашел, — это не трогать атрибут AssemblyVersion проекта C, а вместо этого использовать атрибут AssemblyInformationalVersion. Таким образом, я могу развертывать более новые версии с помощью NuGet без необходимости обновлять все проекты в иерархической цепочке.   -  person DeeKay    schedule 04.02.2016


Ответы (1)


ILRepack поддерживает этот сценарий и перенаправит любой вызов сборки C на объединенную версию.

Однако он делает это, не глядя на перенаправление привязки, и предполагает, что версия, которую вы просили объединить (в командной строке), является единственной, которую вы хотите использовать. Поведение на самом деле не определено, если версии 1.0 и 1.1 отличаются несовместимым образом (например, тип, используемый в B, был удален из C 1.1).

person Gluck    schedule 09.02.2016