首页 新闻 会员 周边

多个TargeFramework 导致关于Nuget包引用的问题

1
悬赏园豆:100 [已解决问题] 解决于 2019-05-21 09:51

关于 Nuget 包解析的,有个最近项原则, 详情可参考NuGet 如何解析包依赖项 用一张微软的图来解释就是:

这个时候会选择最近的那个包,也就是 2.0 版本的。这没问题。
今天遇到的一个问题是,我的一个Nuget包(称之为 Package A 当前版本为 1.2.3 )本来只支持 netstandard 2.0 的版本,csproj 文件中的定义为

 <TargetFramework>netstandard2.0</TargetFramework>

我有另外一个产品ECS Nuget 包(称之为 Package B 版本为 1.0.0),Package B 需要引用 Package A,

关系路线为 【Package B 1.0.0】 -> 【Package A 1.2.3】
这时,程序中调用这两个包可以正常使用的。

后来,由于对 .net framework 的支持,我把原本 Package A 的nuget 包修改了,改成了如下

<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>

Package A 包生成版本为 1.3.2,这个时候,我再引用上述两个包,发现编译没问题,但是在运行时报错了。

我通过升级 Package B 可以解决上面问题,但是为什么会出现这个错误呢?是因为使用了 TargetFrameworks ?还望大佬们指点指点

BUTTERAPPLE的主页 BUTTERAPPLE | 老鸟四级 | 园豆:3190
提问于:2019-05-17 19:27
< >
分享
最佳答案
1

建议对比一下 publish 文件夹中的 .deps.json 文件

收获园豆:100
dudu | 高人七级 |园豆:30994 | 2019-05-18 08:52

比如安装了 nuget 包 EnyimMemcachedCore 后,.deps.json 中包含的信息:

"EnyimMemcachedCore/2.2.2": {
  "dependencies": {
    "Microsoft.AspNetCore.Http.Abstractions": "2.2.0"
  },
  "runtime": {
    "lib/netstandard2.0/EnyimMemcachedCore.dll": {
      "assemblyVersion": "2.2.2.0",
      "fileVersion": "2.2.2.0"
    }
  },
  "compile": {
    "lib/netstandard2.0/EnyimMemcachedCore.dll": {}
  }
}

TargetFramework 的设置为影响到 runtime 的值

dudu | 园豆:30994 (高人七级) | 2019-05-18 09:27

@dudu: 这个思路可以,我去试试。

BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2019-05-18 11:08

@dudu: 大佬大佬,按照这个思路,有了点眉目,也发现了一个程序中的Bug
第一张图使用老版本的Core,生成出来的deps.json

可以看出 AssemblyVersion 和 FileVersion 都为空,但是通过 runtimeconfig.json 文件可以找到 AssemblyVersion 和 FileVersion 为空的 dll。难道是因为 AssemblyVersion 和最开始的 1.3.2 文件不匹配导致的吗?

 "aliyun-net-sdk-core/1.3.2": {
        "dependencies": {
          "Serilog": "2.5.0",
          "Serilog.Exceptions": "4.0.0",
          "Serilog.Sinks.File": "4.0.0"
        },
        "runtime": {
          "lib/netstandard2.0/aliyun-net-sdk-core.dll": {
            "assemblyVersion": "0.0.0.0",
            "fileVersion": "0.0.0.0"
          }
        }
      }

下面是重新生成后的 deps.json 文件,可以正常运行之前低版本的项目包。

BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2019-05-20 20:14

@BUTTERAPPLE: 引用的版本号是 1.3.2assemblyVersionfileVersion 的版本不能低于 1.3.2

dudu | 园豆:30994 (高人七级) | 2019-05-20 21:52

@dudu: 由于 引用的 1.3.2 版本, 然而 CLR 在加载程序集时,找不到 Version 为 1.3.2 的DLL,于是就找原本项目引用的 1.2.3 版本,没有找到,于是报错。理清楚了。

BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2019-05-21 10:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册