更改IntermediateOutputPath中断C#编译(MSB3491)

问题描述:

我试图将构建Visual Studio 2015解决方案的中间输出合并到我的输出目录中的单个目录中。该解决方案包含一个C#类库(以及其他项目)。更改IntermediateOutputPath中断C#编译(MSB3491)

为了做到这一点,库项目进口“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目录下,所以这是很公平。我不明白的是为什么它试图写入该位置的文件,因为我已经更改了基本和中间输出文件的位置。

我错过了一些东西,但是我的谷歌搜索没有拉起任何特别有用的东西 - 任何建议都会很好。

+0

OK,我会带*头*桌子来跟进 - 我删除了我的顶级目录,获取从Git和错误走了。然而,这些临时文件正在[projectname] \ obj \ ...目录中生成,所以问题仍然存在 - 为什么visual studio将中间输出文件写入除IntermediateOutputPath变量指定的目录之外的目录? – Blue

虽然试图创建一个简单的演示,我终于想通了 - 我的包含项目(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>