在使用C#开发多项目应用(比如插件机制应用)时,经常需要将特定项目的输出路径精确指定到某目录,以便于联合调试。
我们都知道可以通过在 Visual Studio 中设置输出路径(OutputPath)来更改项目输出文件所在的位置。对于 .NET Core 所使用的 Sdk 风格的 csproj 格式来说,你可能会发现实际生成路径中带了 netcoreapp3.0 或者 net472 这样的子文件夹。
然而有时我们并不允许生成这样的子文件夹。本文将介绍可能影响实际输出路径的各种设置。
项目和输出路径
对于这样的一个简单的项目文件,这个项目的实际输出路径可能是像下图那样的。
|
1 2 3 4 5 6 |
<Project> <PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> <OutputPath>bin\$(Configuration)</OutputPath> </PropertyGroup> </Project> |

有没有办法可以不要生成这样的子文件夹呢?答案是可以的。
影响输出路径的属性
OutputPath 属性默认由这些部分组成:
|
1 |
$(BaseOutputPath)\$(PlatformName)\$(Configuration)\$(RuntimeIdentifier)\$(TargetFramework.ToLowerInvariant())\ |
如果以上所有属性都有值,那么生成的路径可能就像下面这样:
|
1 |
bin\x64\Debug\win7-x64\netcoreapp3.0 |
具体的,这些属性以及其相关的设置有:
$(BaseOutputPath)默认值bin\,你也可以修改。$(PlatformName)默认值是$(Platform),而$(Platform)的默认值是AnyCPU;当这个值等于AnyCPU的时候,这个值就不会出现在路径中。$(Configuration)默认值是Debug。$(RuntimeIdentifier)这个值和$(PlatformTarget)互为默认值,任何一个先设置都会影响另一个;此值即x86、x64等标识符。可以通过$(AppendRuntimeIdentifierToOutputPath)属性指定是否将此加入到输出路径中。$(TargetFramework)这是在 csproj 文件中强制要求指定的,如果不设置的话项目是无法编译的;可以通过$(AppendTargetFrameworkToOutputPath)属性指定是否将此加入到输出路径中。
现在,你应该可以更轻松地设置你的输出路径,而不用担心总会出现各种意料之外的子文件夹了吧!