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

关于一个类库打包的问题

  •  
  •   refkent · 2020-01-02 15:44:20 +08:00 · 2606 次点击
    这是一个创建于 1790 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人本不是专门的.NET 开发,公司业务上有.NET SDK 的开发需求,于是鬼使神差地落到了我的头上,我们的 SDK 是以类库( DLL )的形式提供给客户的,最近遇到过一些问题,来问问大家有没有好的解决办法,百度一下好像关键字不太对,没找到我这里想要的。

    • 问题:

    因为我们的 SDK 依赖了.NET Json,就是那个 Newtonsoft,这个时候生成 DLL 后,会有两个 DLL:

    SDK 的本体,
    Newtonsoft.json.dll
    

    但是客户用的 json 类库可能与我们的版本不太一致,导致我们本体引入后,json 的版本对不上,无法使用。

    可否有办法能够解决这个问题呢,我感觉是我们生成打包的时候配置不太对的原因,可否兼容比如 7.0 以上版本的 json 都可以引用之类的,还望大佬们能够指点一下。

    4 条回复    2021-10-17 11:57:02 +08:00
    Iamnotfish
        1
    Iamnotfish  
       2020-01-02 23:18:49 +08:00
    大概思路就是要么用客户的 JSON 类版本去写你的代码。要么就升级客户的 JSON 版本。
    https://michaelscodingspot.com/how-to-resolve-net-reference-and-nuget-package-version-conflicts/
    参考一下这个文章试试
    crclz
        2
    crclz  
       2020-01-02 23:58:38 +08:00
    在你的项目里面用 nuget 安装客户的版本。然后打包成 nupkg,别打包成 dll。
    ColinZeb
        3
    ColinZeb  
       2020-01-06 16:12:51 +08:00
    bindingRedirect 可以解决这个问题
    coder001
        4
    coder001  
       2021-10-17 11:57:02 +08:00
    我这里有个偏方,如果两个库版本差异太大以至于兼容不了,可以考虑把依赖捆进来
    方案 1:用 IL Merge ( ILRepack )
    方案 2:把程序集嵌入资源,动态加载反射调用

    反正我是遇到过老项目上依赖了老版本的 NewtonsoftJson 而且是有 BUG 的,还差异过大没法用 bindingRedirect 直接用新版本
    那就只好嵌入新版的程序集,动态加载反射调用,AppDomain.AssemblyResolve 事件挺好用的,按需把程序集提供给 Runtime
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3380 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:24 · PVG 19:24 · LAX 03:24 · JFK 06:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.