dll 版本依赖问题求教

2019-12-07 12:14:42 +08:00
 thfurior

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 库,这个无法做到

所以,有什么改动量比较小的解决方案么?

1461 次点击
所在节点    程序员
7 条回复
MonoLogueChi
2019-12-07 12:20:01 +08:00
类名冲突?两个 SDK 使用同一个 C 可以吗
markyangd
2019-12-07 12:40:07 +08:00
是不是 b、y 都是你自己写的,就只有 c 有多个版本?如果是,那你可以直接改 c dll 的名称,比如改为 c1、c2,然后在 b 代码里用 Assembly.LoadFile(c1
的路径)来加载 c1,通过反射抓对应的类和执行方法,同理,在 y 代码里去加载 c2。
thfurior
2019-12-07 12:57:11 +08:00
@MonoLogueChi
@markyangd
同名的 dll 提供的是 c 语言形式的接口,但函数不尽相同,都有自己魔改的接口,无法兼容
A B C 和 X Y 都是 sdk 的 dll,没有源码
opengps
2019-12-07 13:03:24 +08:00
做的微服务架构项目越多,这个情况越普遍,尤其是 newtongsoft.json 这种基础类库。
这种情况对于设计模式-开闭原则的依赖程度很高,所有类库都应该按照开闭原则“只增不减,不改出入参结构”,来实现高版本兼容低版本
geelaw
2019-12-07 13:08:40 +08:00
目测原因是两者都用 loader 加载 C DLL 导致的 DLL hell ?

可以尝试自己写一个 DLL 转发所有的 A 的 API,但不要用 loader 加载完毕 A,用 LoadLibrary 和 GetProcAddress。
geelaw
2019-12-07 13:10:47 +08:00
@geelaw *加载完毕 - 加载

另一个可能的方法是尝试用 COM,写一个包装器,然后通过进程外实例化得到隔离,但代码几乎不用改动。
thfurior
2019-12-07 14:14:47 +08:00
@geelaw
感谢回复,我先试试动态加载 A 的接口,不行再用 COM

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/626758

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX