关于 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 ?还望大佬们指点指点
建议对比一下 publish 文件夹中的 .deps.json
文件
比如安装了 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: 这个思路可以,我去试试。
@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: 引用的版本号是 1.3.2
,assemblyVersion
与 fileVersion
的版本不能低于 1.3.2
@dudu: 由于 引用的 1.3.2 版本, 然而 CLR 在加载程序集时,找不到 Version 为 1.3.2 的DLL,于是就找原本项目引用的 1.2.3 版本,没有找到,于是报错。理清楚了。