VS2010和MSBuild在组合的C++/C#解决方案上获得了不同的结果

Fyo*_*kin 5 msbuild build visual-studio-2010

我有一个很大的VS2010解决方案,其中包含一堆C#项目.其中一个项目通过P/Invoke消耗C++(本机,也称为非托管)库.为确保一切正确构建,我在同一解决方案中包含了所说的C++项目.现在,问题就出现了.

简而言之:MSBuild神秘地删除了一些输出文件,而VS2010正确构建.
.

长篇大论:
以前(VS2005/2008),我会利用名为"Project Dependencies"的漂亮功能.这是允许您选择给定项目所依赖的特定项目的事情,因此环境确保首先构建这些项目.

然而,VS2010已朝着MSBuild的方向发展,现在项目依赖性显然不起作用.他们只是没有.(例如,请参阅此问题)现在,为了确保我的C++项目在使用它之前构建,我必须"添加引用".所以我做到了.一切似乎都很好.

但是,然后,我转到我的命令行并启动MSBuild来构建相同的解决方案.而且一切都很好.但是当我查看输出文件夹时,C++项目的输出不存在!

MSBuild控制台输出清楚地表明C++项目确实在某些时候构建.我甚至在一些项目中插入了一些" dir bin\MYPROJNAME.dll "语句作为Post-Build步骤,以查看文件是否存在 - 而且它们是!以下是命令行窗口的屏幕截图.以红色圈出的是文件存在的时刻(在顶部),然后是文件丢失的时刻(在底部).

另一个奇怪的事情是,该项目显然已经建成两次.请参阅屏幕截图中的红色下划线 - 这是关于构建同一项目的第二条消息(第一条消息,以及所有编译器输出,都在屏幕上方).

看起来这第二个构建事件真的是导致文件被删除的原因:当我完全禁用构建这个项目时(通过解决方案属性),它只构建了一次,最后文件就在那里.我本可以称之为"解决方案",但随后它在Visual Studio本身中断:VS只是不构建项目.

解决此问题的另一种方法是从使用C#项目中删除"项目引用".然后MSBuild只会构建一次C++项目,文件将在那里.但是它又打破了另一个地方:对C++项目的更改不会触发重建消费的C#项目.

所以问题是:如何让MSBuild不删除怪异的文件?

Tuo*_*nen 1

对这个问题的简短(有点黑客)回答:

您的目录位于 PostBuildEvents 中。如果您添加 attrib +r 它不会删除您的文件:

<Exec Command="attrib +r $(TargetPath)"/>
Run Code Online (Sandbox Code Playgroud)

(其中 TargetPath 应该是 dll 文件...)