У меня есть проект 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. Есть идеи, как решить эту проблему, не обновляя всегда все проекты в цепочке иерархии? Или любое предложение о том, что я делаю неправильно?