如题,一个 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>项。
所以我现在非常迷糊,到底这个<CopyLocal>和<Private>是什么关系呢?我之前以为是升级换代的关系,但是即使我删掉了旧项目中的<Private>只保留<CopyLocal>,在编译项目时,文件复制依然会按照 Private 的默认值(true)执行文件复制与 Fody 打包,而完全无视了<CopyLocal>的值。彻底把我给整不会了
感谢各位大佬的解答(跪谢)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.