V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thfurior
V2EX  ›  程序员

dll 版本依赖问题求教

  •  
  •   thfurior · 2019-12-07 12:14:42 +08:00 · 1446 次点击
    这是一个创建于 1594 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    7 条回复    2019-12-07 14:14:47 +08:00
    MonoLogueChi
        1
    MonoLogueChi  
       2019-12-07 12:20:01 +08:00 via Android
    类名冲突?两个 SDK 使用同一个 C 可以吗
    markyangd
        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。
    thfurior
        3
    thfurior  
    OP
       2019-12-07 12:57:11 +08:00
    @MonoLogueChi
    @markyangd
    同名的 dll 提供的是 c 语言形式的接口,但函数不尽相同,都有自己魔改的接口,无法兼容
    A B C 和 X Y 都是 sdk 的 dll,没有源码
    opengps
        4
    opengps  
       2019-12-07 13:03:24 +08:00
    做的微服务架构项目越多,这个情况越普遍,尤其是 newtongsoft.json 这种基础类库。
    这种情况对于设计模式-开闭原则的依赖程度很高,所有类库都应该按照开闭原则“只增不减,不改出入参结构”,来实现高版本兼容低版本
    geelaw
        5
    geelaw  
       2019-12-07 13:08:40 +08:00 via iPhone
    目测原因是两者都用 loader 加载 C DLL 导致的 DLL hell ?

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

    另一个可能的方法是尝试用 COM,写一个包装器,然后通过进程外实例化得到隔离,但代码几乎不用改动。
    thfurior
        7
    thfurior  
    OP
       2019-12-07 14:14:47 +08:00
    @geelaw
    感谢回复,我先试试动态加载 A 的接口,不行再用 COM
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3164 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 14:16 · PVG 22:16 · LAX 07:16 · JFK 10:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.