【问题标题】:Why do .NET 5 projects create two identically named DLLs, one in the main binaries folder and one in a refs subfolder, in addition to the EXE?为什么 .NET 5 项目除了 EXE 之外还要创建两个同名的 DLL,一个在主二进制文件夹中,一个在 refs 子文件夹中?
【发布时间】:2021-05-02 22:30:28
【问题描述】:

如果我构建一个生成可执行文件的 .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 一起使用?

【问题讨论】:

  • 可能你的项目设置要求编译器生成一个引用程序集,blog.lextudio.com/…
  • 哦,有趣。我的项目中有一个 app.config 仍在引用 .NET Framework 4.5.1。让我们看看如果我删除它会发生什么......
  • 不,删除 app.config 并没有摆脱 ref DLL;我删除了它,当我构建解决方案时它又回来了......
  • 启用 MSBuild bin 日志,您可以轻松找到生成该 ref 文件夹的内容、msbuildlog.com 以及它周围的所有其他信息。
  • @ekolis 我在下面更新的答案有帮助吗?

标签: .net visual-studio visual-studio-2019 .net-5


【解决方案1】:

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

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

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

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

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

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

我在这里找到了更官方的来源:它是来自 MS devblog 的 QA(虽然它适用于 .net 核心)

问题:当您发布 ASP.NET Core Web 应用程序时,使用 CodeGen 应用程序,它创建一个 refs 文件夹。这是什么用的 为了?

答案:“refs”文件夹是在 msbuild 属性设置为 true。这是 需要保留程序集的应用程序所需的 在编译期间使用,通常是因为他们需要做一些 也在运行时编译,例如编译 Razor 视图。

当项目使用 Microsoft.NET.Sdk.Web(ASP.NET Core 项目应该始终是 正在做)。但是,我们的 Razor 软件包包含一个目标,在 “dotnet publish”预编译 Razor 视图,然后删除 ref 输出中的文件夹。当 引用了 Microsoft.AspNetCore.Mvc.Razor.ViewCompilation 包。 它可以通过设置 属性。 Microsoft.AspNetCore.All 包拉入此包,以便默认启用行为 适用于所有新项目。

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

Devblog why ref folder?

【讨论】:

  • 嗯,这很奇怪 - 这是一个 WPF 应用程序,它没有引用 ASP.NET...
  • 这并不奇怪,因为 WPF 项目也会使用这些。我已经更新了答案以对此进行扩展。希望对您有所帮助。
【解决方案2】:

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

MyProject.dll
主应用程序 dll - 具有入口点的跨平台 dll。
您可以选择使用Single file deployment and executable 将其放入特定于平台的.exe https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2017-04-10
    • 2020-12-20
    • 1970-01-01
    • 2013-03-02
    • 2018-08-09
    • 2023-03-29
    相关资源
    最近更新 更多