我有项目A,它引用了程序集B和程序集C.程序集B也引用程序集C,但是在项目A中的另一个版本中。两个程序集(B和C)在项目A中通过NuGet引用(尽管两者都是程序集在我自己的控制之下,所以如果必须,我可以改变它们的构建方式 我希望这张照片可以说明我的意思: 程序集层次结构:
在Project A中我有一个app.config,它在程序集C上有一个bindingRedirect,指向从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会考虑bindingRedirect,并始终指向程序集C的1.1.0.0版本。 但是,如果我尝试使用程序集B(1.0)和程序集C(1.1)ILMerge项目A的输出(也是程序集也是如此),我会收到以下错误:
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的项目也指向程序集C的1.1版,一切正常,但这不是我想要实现的目标。
所以我认为问题是,ILMerge没有考虑项目A的app.config。 如果不总是更新层次结构链中的所有项目,如何解决这个问题?或者对我做错了什么的任何建议?
答案 0 :(得分:0)
ILRepack支持此方案,并将对程序集C的任何调用重定向到合并版本。
但是,如果没有查看绑定重定向,它会这样做,并假设您要求合并的版本(在命令行上)是您要使用的唯一版本。如果版本1.0
和1.1
以不兼容的方式存在差异(例如,B中使用的类型已从C 1.1
中删除),则行为尚未真正定义