如何在同一应用中加载带不同依赖的同名DLL不同版本?
同一应用中隔离不同版本DLL依赖的问题
我现在碰到了一个棘手的DLL版本隔离问题:有两组不同版本的关联DLL——Av1.dll+Bv1.dll,以及Av2.dll+Bv2.dll,其中A系列的DLL会调用对应B系列里的方法。我需要在同一个应用里同时使用这两组版本,但实际运行时出现了依赖加载混乱的情况:
我期望的依赖指向是:
Av1.dll --> Bv1.dll Av2.dll --> Bv2.dll
可实际运行后却是:
Av1.dll --> Bv1.dll Av2.dll --> Bv1.dll
另外,因为所有输入输出对象都必须实现MarshalByRefObject,用AppDomains的方案实在太繁琐,完全没法落地。现在我想找一些创意性的学术解决方案(不用考虑重构DLL这类现实妥协方案),比如能不能通过动态检查、重写甚至重新编译DLL的方式,把内部的依赖引用替换成这样的形式:
A.dll --> B.dll C.dll --> D.dll
补充场景说明
给大家举个更具体的例子:第三方提供了一套用于计算所得税的关联DLL库,常规用法很简单:
TaxHelper helper = new TaxHelper(); var result = helper.CalculateIncomeTax(...params...);
到了新税务年度,第三方发布了新版本的库——类和DLL的名称完全没变,只是计算规则更新了,但我需要同时支持计算过往年度和当前年度的税款。我尝试用以下代码加载不同版本:
Assembly taxHelper1Assembly = Assembly.LoadFrom(...path1...); Assembly taxHelper2Assembly = Assembly.LoadFrom(...path2...); Type taxHelper1Type = taxHelper1Assembly.GetType(...); Type taxHelper2Type = taxHelper2Assembly.GetType(...); dynamic taxHelper1 = Activator.CreateInstance(taxHelper1Type); dynamic taxHelper2 = Activator.CreateInstance(taxHelper2Type); var result1 = taxHelper1.CalculateIncomeTax(...params...); var result2 = taxHelper2.CalculateIncomeTax(...params...);
这种方式确实能创建出不同版本的TaxHelper实例,也能得到不同的计算结果,但内部依赖出了问题:taxHelper2居然会引用taxHelper1的依赖DLL,没法正确使用自己版本的依赖组件。
已发现的线索
我在Stack Exchange的相关讨论中找到了一个可能的解决方案,主题是关于手动加载依赖程序集的内容。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

