如题,一个 C#的 dll 项目(之前是.net framework 4.8 )中,通过 fody 打包引用的库。VS 为 2022 版,Fody 为 nuget 上的最新版。
默认情况下,设置引用的“复制本地”属性为 false 时,会自动在 csproj 中记录<Private>False</Private>,编译时就不会复制此文件,最后 Fody 生成的 dll 文件中也不会包含此引用的打包文件
<Reference Include="Example">
<HintPath>..\Lib\Example.exe</HintPath>
<Private>False</Private>
</Reference>
在将项目更改为.net standard 2.0 后(经测试,2.1 ,以及.net 5.0\6.0 均有同样问题),引用的右下角属性内的“复制本地”选项变为了影响 CopyLocal 项,例如我此时将这个文件改为“复制本地”,那么 csproj 中将会变成这样
<Reference Include="Example">
<HintPath>..\Lib\Example.exe</HintPath>
<Private>False</Private>
<CopyLocal>True</CopyLocal>
</Reference>
问题来了,这样的配置下,在生成时并不会复制 Example.exe ,fody 也不会打包此文件。
即使去掉 Fody 的引用,最后生成文件时,也依然不会在生成目录里复制 Example.exe ,所以大概和 Fody 是没关系的。
反而如果手动更改<Private>为 True ,那么编译时将会正常复制并打包。
简单来说就是,VS 在编译时候似乎完全无视了<CopyLocal>,而只认<Private>。
查看微软的官方文档,VS2022 的 MSBuild 说明中只有 Private 元数据而没有 CopyLocal 。根据说明,Private 属性指示“指定是否应将引用复制到输出文件夹。 此特性与 Visual Studio IDE 中的引用的“复制本地”属性相匹配。”
从头到尾都没有提到过<CopyLocal>,根据生成时的表现来看,确实也只有<Private>设置的值有实际效果。
但是即使直接新建空白项目,引用文件并设置“复制本地”后,VS 修改的也只有 csproj 中的<CopyLocal>项而不是<Private>项。
在右侧的属性中任何选项都无法看到或修改当前 csproj 中<Private>的值。只能手动编辑 csproj 文件。
所以我现在非常迷糊,到底这个<CopyLocal>和<Private>是什么关系呢?我之前以为是升级换代的关系,但是即使我删掉了旧项目中的<Private>只保留<CopyLocal>,在编译项目时,文件复制依然会按照 Private 的默认值(true)执行文件复制与 Fody 打包,而完全无视了<CopyLocal>的值。彻底把我给整不会了
感谢各位大佬的解答(跪谢)
1
konar 2022-01-17 16:58:51 +08:00
似乎 CopyLocal 来自 VS 而 Private 来自 MSBuild
|
2
konar 2022-01-17 17:08:04 +08:00
|