.NET 5.0 bin文件夹中的Ref文件夹

79

编译 .NET 5.0 应用程序时,ref 文件夹是什么?

我的意思是这个:

[project_path]\bin\Debug\net5.0\ref\

什么应用程序?里面有什么? - Sinatr
2
@Sinatr 这只是一个没有依赖关系的测试控制台应用程序。里面只有一个dll文件(它是应用程序的入口点),而且在父文件夹中还有一个大小略有不同的相同dll文件。只需创建一个.NET5.0示例,您就会看到。 - Alek Depler
提示:使用 “dotnet clean” 命令来清除这些中间生成的文件。这将删除“发布”目录之外的文件以及“ref”目录中的文件。 - kbridge4096
1个回答

96
这些被称为引用程序集(只包含程序集的公共接口的程序集),它们有助于加速构建过程,因为依赖于该程序集的项目将能够看到即使程序集内部发生了变化,由于外观仍然相同,因此无需重新编译。
这些引用程序集需要从外部看起来与真正的程序集相同。因此,它们具有相同的文件名、程序集名称、程序集标识等等。这允许构建系统将它们用作真正程序集的替代品。由于这些程序集没有任何实现细节,它们只在内容接口更改时才会更改。由于这些事实,它们不能存在于实际构建输出的同一文件夹中,这就是额外的ref文件夹的原因。MsBuild将自动使用这些引用程序集来加速构建过程(以生成和比较参考程序集为代价,并在编译代码导致新的项目输出和输出目录中的几个文件时)。
如果您的项目没有被其他项目引用,那么您将不会从这些引用程序集中获得任何好处(除非您将它们交给第三方)。您可以通过向项目文件添加此属性来关闭此功能:
<PropertyGroup>
     <!-- 
     Turns off reference assembly generation 
     See: https://learn.microsoft.com/en-us/dotnet/standard/assembly/reference-assemblies
     -->
     <ProduceReferenceAssembly>false</ProduceReferenceAssembly>
</PropertyGroup>

更改设置后,请确保清理生成的输出。

这些参考程序集还可以用于允许人们编译项目以与您的系统配合使用,而无需安装/重新分发在您的服务器上运行的实际已编译程序集。这样,人们就可以开发扩展、插件或客户端应用程序,而无需让他们访问实际实现。这有助于保护您的知识产权,因为 .NET 程序集很容易反编译。

另请参见:


6
因为它们的名称与实际程序集完全相同,所以它们不能放置在同一个文件夹中。如果您不想要它们,可以通过在项目文件中添加 <ProduceReferenceAssembly>false</ProduceReferenceAssembly> 来关闭参考程序集生成(可能会牺牲更多重建时间来处理较大的解决方案)。 - jessehouwing
2
这正是我正在寻找的解释,谢谢@jessehouwing。 - AFract
2
将其添加到<PropertyGroup>中,以防有人有疑问;-) - 0Pat
1
似乎不再工作?VS 2022,NET CORE 3.1 - Leandro Bardelli
1
@LeandroBardelli,因为它在许多情况下可以极大地加快构建时间,人们需要它。如果需要,您可以选择退出。确保清理构建输出以使这些文件消失。 - jessehouwing
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接