You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一应用中加载带不同依赖的同名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:30:20