更改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目录下,所以这是很公平。我不明白的是为什么它试图写入该位置的文件,因为我已经更改了基本和中间输出文件的位置。
我错过了一些东西,但是我的谷歌搜索没有拉起任何特别有用的东西 - 任何建议都会很好。
答
虽然试图创建一个简单的演示,我终于想通了 - 我的包含项目(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>
OK,我会带*头*桌子来跟进 - 我删除了我的顶级目录,获取从Git和错误走了。然而,这些临时文件正在[projectname] \ obj \ ...目录中生成,所以问题仍然存在 - 为什么visual studio将中间输出文件写入除IntermediateOutputPath变量指定的目录之外的目录? – Blue