为啥会创建“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 是否包含属性.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 数据库文件?