更改IntermediateOutputPath会破坏C#编译(MSB3491)

时间:2017-01-10 03:43:37

标签: c# visual-studio-2015 configuration

我正在尝试将构建Visual Studio 2015解决方案的中间输出合并到输出目录中的单个目录中。该解决方案包含一个C#类库(以及其他项目)。

为了做到这一点,库项目导入“common.proj”,它定义了以下内容:

<BaseIntermediateOutputPath>$(OutputPath)OBJ\</BaseIntermediateOutputPath>
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(MSBuildProjectName)\</IntermediateOutputPath>

在定义这些值之前,项目已成功编译。为了清楚起见,$(OutputPath)也在common.proj中定义,似乎没问题(即当构建成功时,它包含预期的输出)。

定义值后,编译失败并显示以下消息:

error MSB3491: 
Could not write lines to file "obj\x86\Release\\TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B1)BC5D3.cs". 
Could not find part of the path 'C:\Data\Repositories\Code\[Subsystem]\[subgroup]\[projectname]\src\obj\x86\Release\TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B1-BC5D3.cs'.

我理解为什么构建过程无法写入文件 - obj目录不再位于项目的src目录下,所以这很公平。我不明白为什么它试图写入该位置的文件,因为我已经更改了基本和中间输出文件位置。

我错过了什么,但我的谷歌搜索还没有提出任何特别有用的东西 - 任何建议都会很好。

1 个答案:

答案 0 :(得分:1)

在尝试创建一个简单的演示时,我终于弄清楚了 - 我的包含项目(Common.proj)在导入Microsoft.CSharp.targets之前被包含在内,但是之前还有一个额外的Microsoft.CSharp.targets导入。在文件中。

看起来类似于以下内容:

myproject.csproj:

<?xml version=”1.0”…>
<Project … >
    …
    <Import Project=”$(MSBuildBinPath)\Microsoft.CSharp.targets” />
    …
    <Import Project=”$(SolutionDir)Common.proj” />
    <Import Project=”$(MSBuildBinPath)\Microsoft.CSharp.targets” />
    …
</Project>

一旦我更新它以引用Common.proj并删除对Microsoft.CSharp.targets的第二个引用,它就开始正确构建。

最终myproject.csproj:

<?xml version=”1.0”…>
<Project … >
    …
    <Import Project=”$(SolutionDir)Common.proj” />
    <Import Project=”$(MSBuildBinPath)\Microsoft.CSharp.targets” />
    …
</Project>