在C#Project中设置中间目录

时间:2009-09-29 14:04:51

标签: visual-studio-2008

在VS 2008中,有没有办法在C#项目中设置中间目录(.obj文件的位置,而不是最终目标)?

3 个答案:

答案 0 :(得分:6)

您需要覆盖BaseIntermediateOutputPath msbuild var,有关它的更多信息here

答案 1 :(得分:1)

我使用Visual Studio Express 2013找到了解决方案;我忘了哪个版本的VS引入了MSBuild,我无法确定这适用于任何其他版本。但是这里有:

C:\Windows\Microsoft.NET\Framework中是与.NET版本对应的子目录;在我的系统上使用VSX2013,感兴趣的文件夹是v4.0.30319。 (那是MSBuild使用的.NET版本,而不是我目标的。)在这个文件夹中有.targets个文件,它们是MSBuild规则的集合。

Microsoft.CSharp.targets的开头附近是一些将导入更多规则文件的规则。这些import语句中的第三个从构建变量CustomBeforeMicrosoftCSharpTargets命名的文件中导入。您可以通过阅读规则来弄清楚这个名称,但是添加自定义构建步骤会更容易

echo $(CustomBeforeMicrosoftCSharpTargets)

构建并查看输出。就我而言,完整的路径是

C:\Program Files (x86)\MSBuild\v12.0\Custom.Before.Microsoft.CSharp.targets

注意:在我的情况下,已经有一个文件夹C:\Program Files (x86)\MSBuild\12.0但不是v12.0

所以(作为管理员)我创建了文件夹并放置了一个Custom.Before.Microsoft.CSharp.targets文件,如下所示:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <BaseIntermediateOutputPath>$(SolutionDir)\Build\$(MSBuildProjectName)</BaseIntermediateOutputPath>
    </PropertyGroup>
</Project>

注意:$(ProjectName)不起作用,请使用$(MSBuildProjectName)

当我构建时,OBJ被放置在解决方案下的Build目录下,而不是在项目下,位于具有典型命名约定的子目录中:DebugReleasex86\Debugx64\Release

这并没有完全符合要求:我真的想把它们放在%TEMP%中,但变量没有扩展,所以我最终得到了一个名为%TEMP%的项目下的构建文件夹。将扩展路径放在规则中工作得很好,但%APPDATA%的其他子文件夹由于权限问题而失败。

我认为这可用于配置任何这些变量;阅读默认的.TARGETS文件是一件苦差事,但其中有一些有用的评论。

答案 2 :(得分:0)

我不相信。但是,您可以将可执行文件,dll等任何内容复制到构建后事件中的另一个文件夹中。 (“项目属性”中的“构建事件”选项卡)