为啥会创建“net6.0-windows”子文件夹?

Posted

技术标签:

【中文标题】为啥会创建“net6.0-windows”子文件夹?【英文标题】:Why is 'net6.0-windows' sub folder created?为什么会创建“net6.0-windows”子文件夹? 【发布时间】:2022-01-02 13:00:52 【问题描述】:

我正在使用 Visual Studio 2022 并创建了一个 winforms .net 6 应用程序。我为我的发布版本指定了一个输出路径,我希望在其中创建 .exe,但 Visual Studio 创建了一个名为“net6.0-windows”的子文件夹并将 exe 放在那里。我该如何阻止它并让它将 exe 放在我指定的位置?

一些背景:我正在将 .Net Framework 4.8 Winforms 升级到 .Net 6。在 .net 框架中,它将 exe 放在指定的输出文件夹中(没有子文件夹)。我想保持相同的行为,因为其他文件和实用程序也需要在其中或查看该文件夹。

Visual Studio 中指定的输出路径

[]

实际输出路径

[]

【问题讨论】:

您的 .csproj 是否包含属性 ?当在同一个构建中针对多个框架时,它将执行您所看到的操作。 这是默认和预期的行为 - Winforms 是 Windows-only,所以您真正的目标是 .net6-windows,因此这就是您获得的子文件夹。你可以停止这个 - 你需要习惯它并接受它...... .NET 6 是 .NET Core 6。运行时特定的文件夹是默认的,可能从 .NET Core 1.0 开始。 .NET Core 应用程序可能针对不同的运行时,因此不可能将所有内容都放入 bin\Release I want to keep with the same behavior 您不再使用 .NET Framework,而是使用 .NET Core。工具希望在正确的位置找到文件。 bin\Release 甚至不包含已发布的二进制文件,它们位于 publish 文件夹中。如果您发布单文件可执行文件,构建文件夹仍将包含单个文件,而 publish 文件夹将包含单个 .exe。如果要创建安装程序,则必须使用 publish 文件夹中的运行时特定文件,而不是 bin\Release 文件夹 【参考方案1】:

我将提供以下信息以供参考和回答问题。

您可以通过将以下属性添加到项目文件中来防止将 TargetFramework 添加到输出文件夹。

<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>

此外,您可以防止添加 RuntimeIndentifier(例如 win-x64),如果有的话,将此属性设置为 false:

<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>

你应该这样做吗?

也许不是。这些目录的存在是有原因的:允许多个 TargetFramework(版本)和/或多个 RuntimeIndentifier 并行(否则输出会以一种邪恶的方式混合)。

【讨论】:

如果您正在构建 WinForms/WPF 应用程序,是否需要这样做?我知道在构建由许多不同运行时类型分发和使用的库时需要它,但是在构建桌面应用程序时呢? 谢谢克里斯蒂安,你列出的第一行就成功了。对于那些想知道为什么我想要这个的人,这个软件是用于制造设备的,并且只会安装在几台计算机上,所以我们不使用发布,我们只是将发布构建文件夹移动到设备上的一个特殊位置,它需要与其他软件保持正确的功能。它还具有 FDA 法规和所涉及的文件的额外乐趣。 请注意,正如其他人所说,“Release”(或“Debug”)文件夹通常包含应用程序需要运行的所有依赖项。完整的故事很复杂(查找“自包含的 .net 核心应用程序”开始)。一般来说,只有在执行“发布”步骤之后,您才能确定您拥有应用程序在不同机器上运行所需的所有依赖项。

以上是关于为啥会创建“net6.0-windows”子文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 NAudio 会创建一个两倍于应有大小的 WAV 文件?

为啥 Wordpress 会创建一个巨大的 error_log 文件?

为啥会创建一个名为 Azure Blob 存储容器内文件夹名称的空文件?

为啥 Visual Studio 转换向导 2010 会创建海量的 SDF 数据库文件?

为啥编译包含静态嵌套类的类会创建一个名为“EnclosureClass$1”的新 .class 文件? [复制]

为啥启用 Cloud Run API 会创建这么多服务帐号?为啥他们有这么多特权?