.net Visual Studio不断向我的csproj添加属性。为什么?

.net Visual Studio不断向我的csproj添加属性。为什么?,.net,visual-studio,msbuild,visual-studio-2012,csproj,.net,Visual Studio,Msbuild,Visual Studio 2012,Csproj,我正在使用Visual Studio 2012 RC处理我的C#解决方案。我的所有配置特定设置都存储在一个.props文件中,该文件随后包含在我的所有.csproj文件中 然而,VS坚持要将这一点放在“包括”的前面: <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'"> <IntermediateOutputPath>C:\Users\xyz\AppData\Loca

我正在使用Visual Studio 2012 RC处理我的C#解决方案。我的所有配置特定设置都存储在一个.props文件中,该文件随后包含在我的所有.csproj文件中

然而,VS坚持要将这一点放在“包括”的前面:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
   <IntermediateOutputPath>C:\Users\xyz\AppData\Local\Temp\vs855E.tmp\Debug\</IntermediateOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
   <IntermediateOutputPath>C:\Users\xyz\AppData\Local\Temp\vs855E.tmp\Release\</IntermediateOutputPath>
</PropertyGroup>

<Import Project="$(MSBuildProjectDirectory)\..\Common.props" />

C:\Users\xyz\AppData\Local\Temp\vs855E.tmp\Debug\
C:\Users\xyz\AppData\Local\Temp\vs855E.tmp\Release\
为什么呢


仅供参考,我的通用文件如下所示:

因此,如果需要,您可以覆盖这些设置。如果您的导入早于此,则Visual Studio的属性将优先。在MSBuild中,最后一个定义获胜并被使用。这是一件好事。它会导致错误吗?或者您只是不喜欢它?

您已经在项目中指定了。属性文件将具有BaseIntermediateOutput路径。如果不在其中指定任何值,它将从基中派生

如果未指定路径,则从BaseIntermediateOutputPath派生的完整中间输出路径。例如,\obj\debug。如果覆盖此属性,则设置BaseMediateOutPath无效


请参阅:

当MSBuild的路径错误时,可以插入这些中间输出路径

在我们的例子中,在SolutionDir之后为输出文件夹添加了额外的不必要的斜杠

什么对我们不起作用(请注意额外的斜杠):

$(SolutionDir)\out\bin\
$(SolutionDir)\out\obj\
工作内容:

<OutputPath>$(SolutionDir)out\bin</OutputPath>
<IntermediateOutputPath>$(SolutionDir)out\obj</IntermediateOutputPath>
$(SolutionDir)out\bin
$(SolutionDir)输出\obj
若要帮助排除特定情况的故障,请尝试在“工具”->“选项”->“项目和解决方案”->“生成并运行”->“MSBuild项目生成输出详细信息”下打开诊断MSBuild输出和日志记录。然后,搜索生成的文件夹(例如“Temp”)


使用公共proj/props/targets文件是一个好主意,但它确实需要与Visual Studio进行一些斗争。

如果在加载过程中插入XML,我怀疑它与NuGet相关(假设您使用的是NuGet)。如果使用Directory.Build.props文件,则可以在.props文件中获取BaseMediateOutput路径集。阅读这篇stackoverflow文章,了解有关搜索顺序的一些重要信息,以及如何进行搜索的过程

在项目文件中设置BaseIntermediateOutputPath不会重定向NuGet,因为它的值是在MSBuild包含设置BaseIIIntermediateOutputPath的Sdk.props之后设置的。这个问题有两种解决方案。使用Directory.Build.props,或在设置基础后在项目中导入SDK。。。价值我没有试过这种方法 在.csproj文件中的适当位置。 )

以下是一个用于自定义构建的链接,该链接引用了以下一些技术:


简单的回答是,Microsoft从未考虑过您会进行这样的csproj文件定制。有时你可能会定制一点项目文件(运气好),但大多数时候你只是自找麻烦。我不喜欢这样,因为每次我重新加载项目时,这些临时路径都会改变。非常烦人,因为版本控制总是对所有项目进行更改。故障排除步骤对我不起作用(Visual Studio 2013)。项目文件在加载时由VS修改,而不是在生成时修改,因此诊断生成输出没有帮助。
<OutputPath>$(SolutionDir)out\bin</OutputPath>
<IntermediateOutputPath>$(SolutionDir)out\obj</IntermediateOutputPath>