C#程序中通过 DllImport 加载了两个 dll 形式的 sdk 包,这两个 sdk 包依赖 3 个相同名称但不同版本的 dll,加载关系是这样的: 第一个 sdk:A dll -> B dll -> C dll,第二个 sdk:X dll -> Y dll -> C dll
现在的问题是: 两个版本的 sdk 要同时加载,但一旦一个 sdk 加载成功,调用另外一个就会报错,如何指定每个 dll 只加载自己依赖的 C dll ?
网上的解决方案: 1、app.config 通过 dependentAssembly 声明不同版本的 dll,但是因为 C dll 都是每个 sdk 自己魔改的,没有源码,无法获取 publicKeyToken 2、多进程解决,但考虑到现有程序是单进程,如果改为多进程,已有功能的改动量会比较大 3、协调 sdk 提供方提供静态 lib 库,这个无法做到
所以,有什么改动量比较小的解决方案么?
1
MonoLogueChi 2019-12-07 12:20:01 +08:00 via Android
类名冲突?两个 SDK 使用同一个 C 可以吗
|
2
markyangd 2019-12-07 12:40:07 +08:00 via iPhone
是不是 b、y 都是你自己写的,就只有 c 有多个版本?如果是,那你可以直接改 c dll 的名称,比如改为 c1、c2,然后在 b 代码里用 Assembly.LoadFile(c1
的路径)来加载 c1,通过反射抓对应的类和执行方法,同理,在 y 代码里去加载 c2。 |
3
thfurior OP |
4
opengps 2019-12-07 13:03:24 +08:00
做的微服务架构项目越多,这个情况越普遍,尤其是 newtongsoft.json 这种基础类库。
这种情况对于设计模式-开闭原则的依赖程度很高,所有类库都应该按照开闭原则“只增不减,不改出入参结构”,来实现高版本兼容低版本 |
5
geelaw 2019-12-07 13:08:40 +08:00 via iPhone
目测原因是两者都用 loader 加载 C DLL 导致的 DLL hell ?
可以尝试自己写一个 DLL 转发所有的 A 的 API,但不要用 loader 加载完毕 A,用 LoadLibrary 和 GetProcAddress。 |
6
geelaw 2019-12-07 13:10:47 +08:00 via iPhone
|