C# 生成.NET Framework/.NET标准多目标项目时,net461输出文件夹中存在大量程序集

C# 生成.NET Framework/.NET标准多目标项目时,net461输出文件夹中存在大量程序集,c#,packages,.net-standard,.net-standard-2.0,.net-4.6.1,C#,Packages,.net Standard,.net Standard 2.0,.net 4.6.1,我有一个新的SDK风格的csproj,它针对多个框架: <TargetFrameworks>net461;netstandard2.0</TargetFrameworks> net461;netstandard2.0 VS中的dependencies节点按预期列出了“.NETFramework 4.6.1”和“.NETStandard 2.0”-NETStandard文件夹将“NETStandardLibrary”作为SDK依赖项 我对多个TFM的理解是交叉编译类库以

我有一个新的SDK风格的csproj,它针对多个框架:

<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
net461;netstandard2.0
VS中的dependencies节点按预期列出了“.NETFramework 4.6.1”和“.NETStandard 2.0”-NETStandard文件夹将“NETStandardLibrary”作为SDK依赖项

我对多个TFM的理解是交叉编译类库以用作完整框架dll或netstandard dll。但是,在net461输出文件夹中,我看到了100+System.xxx.dll,包括netstandard.dll


为什么所有这些程序集都在输出中?还是我误解了多目标框架的概念?

回购协议中的几个问题详细描述了这个问题。简单的解释是:

原因是net471是第一个实际包含netstandard20 API的.NET框架,其他框架使用垫片


这意味着每次引用.NETStandard nuget包时,如果.netframework的版本低于v4.7.1,它将拉取整个.NETStandard程序集。

这是因为在4.6.1中找到了一些System.XXX.dll,但在2.0中找不到,所以很自然,它必须一起复制,否则它将丢失这些文件。我能想到的一个例子是System.IO.Compression命名空间2.0 4.6.1请注意,4.6.1比2.0有更多的功能,如果在2.0项目中使用4.6.1项,它将不起作用,唯一的方法是让2.0引用我所说的4.6.1 dllI与这种情况正好相反-System.*.dll是通过net461构建输出的…即使所有(大多数?)这些API都构建在框架中。Jacek下面关于垫片的回答解释了这一点。相关:实际上,如果依赖项闭包中的任何dll引用.net标准程序集,则会添加库。因此,如果您创建netstandard 2.0程序集并将其添加为对经典项目的引用,它将添加垫片。这是由VS 2017中提供的构建逻辑和CLI完成的,CLI也可作为VS 2015的扩展。Jacek的链接正是它-不确定我在事先搜索时如何没有遇到它。仍然试图完全了解封面下发生的事情…我(显然很天真!)还以为它是针对net461@noelep我也有同样的问题,我也想知道。你最终解决了吗?