为什么.NET5项目除了创建EXE文件外,还要创建两个名称相同的DLL,一个在主二进制文件文件夹中,一个在refs子文件夹中?

为什么.NET5项目除了创建EXE文件外,还要创建两个名称相同的DLL,一个在主二进制文件文件夹中,一个在refs子文件夹中?,.net,visual-studio,visual-studio-2019,.net-5,.net,Visual Studio,Visual Studio 2019,.net 5,如果我构建一个生成可执行文件的.NET 5项目,我会得到以下文件: bin/Debug/net5.0-windows/MyProject.exe bin/Debug/net5.0-windows/MyProject.dll bin/Debug/net5.0-windows/ref/MyProject.dll 为什么要创建这三个文件?较旧版本的.NET刚刚生成了一个EXE。为什么我们需要在不同的文件夹中使用两个同名DLL来执行EXE?它通常用于运行时使用某些程序集的地方 这些文件用于加快构建过

如果我构建一个生成可执行文件的.NET 5项目,我会得到以下文件:

  • bin/Debug/net5.0-windows/MyProject.exe
  • bin/Debug/net5.0-windows/MyProject.dll
  • bin/Debug/net5.0-windows/ref/MyProject.dll

为什么要创建这三个文件?较旧版本的.NET刚刚生成了一个EXE。为什么我们需要在不同的文件夹中使用两个同名DLL来执行EXE?

它通常用于运行时使用某些程序集的地方

这些文件用于加快构建过程,并包含与其他参考文件相关的精简信息,实际上只是一个接口,因此不必每次在不需要更改的情况下重建项目依赖关系。看见 如果该项目不包括任何其他程序集,则没有什么好处

依赖项列在[ProjectName].deps.json中

可以将其添加到项目文件中以避免生成它们

    <PropertyGroup>
    <ProduceReferenceAssembly>false</ProduceReferenceAssembly>
  </PropertyGroup>

假的
它们对于Razor视图更有用,因为Razor视图是在运行时编译的,并使用此refs文件夹。发布项目时,可以删除该文件夹。即使使用.net core之前的版本,该项目也包含视图使用的程序集列表

我在这里找到了一个更正式的来源:它是来自MS devlog的QA(尽管它适用于.net core)

问题:发布ASP.NET核心web应用程序时使用 CodeGen应用程序,它创建一个refs文件夹。这是用什么 为了什么

答:“refs”文件夹是在 msbuild属性设置为true。这是 对于需要保留以下程序集的应用程序是必需的: 在编译期间使用,通常是因为它们需要执行某些操作 运行时编译,例如编译Razor视图

当项目使用 Microsoft.NET.Sdk.Web(哪些ASP.NET核心项目应始终为 做)。然而,我们的剃须刀包包括一个目标,在 “dotnet publish”预编译Razor视图,然后删除引用 从输出中删除文件夹。当 引用了Microsoft.AspNetCore.Mvc.Razor.viewcomilation包。 可以通过设置< MvcRazorCompileOnPublish>属性。Microsoft.AspNetCore.All 包拉入此包,以便默认情况下启用行为 对于所有新项目

简而言之,如果应用程序中有Razor视图,我们建议 通过引用将项目配置为在发布期间编译它们 Microsoft.AspNetCore.Mvc.Razor.viewcomilation包。这将 缩短启动时间,并从发布中删除“refs”文件夹 为您输出


MyProject.exe
为方便起见,生成了特定于平台的可执行文件,因此无需编写
dotnet MyProject.dll
即可启动应用程序。
根据文档
。NET SDK 2.1
没有生成它

MyProject.dll
主应用程序dll-具有入口点的跨平台dll。
您可以使用
单文件部署和可执行文件

ref/MyProject.dll
Dll,用于通过其他工具进行某些运行时编译。 在@Andrew的回答中描述。编译器选项可以禁用生成

摘要

使用跨平台
.NET Core
您可以以多种不同的方式分发应用程序,但代价是新级别的间接寻址和新的编译器选项。

您的项目设置可能会要求编译器生成引用程序集,哦,很有趣。我的项目中确实有一个app.config仍在引用.NET Framework 4.5.1。让我们看看如果我删除它会发生什么…不,删除app.config并没有摆脱ref DLL;我删除了它,当我构建解决方案时它又回来了…启用MSBuild bin log,您可以很容易地找到生成该ref文件夹的内容以及该文件夹周围的所有其他信息。@ekolis我下面的更新答案有用吗?嗯,这很奇怪-这是一个WPF应用程序,而且它没有引用ASP.NET…这并不奇怪,因为WPF项目也将使用这些。我已经更新了答案,以进一步说明这一点。希望能有帮助。