在项目级别,您有三个选项:
1) 预构建动作
<PropertyGroup>
<PreBuildEvent>notepad.exe Foo.txt</PreBuildEvent>
</PropertyGroup>
2)正常的BeforeBuild目标
<Target Name="BeforeBuild">
<Exec Command="notepad.exe Foo.txt" />
</Target>
3)“附加”到“构建”目标(如 stijn 建议)
<Target Name="BeforeBuild2" BeforeTargets="Build">
<Exec Command="notepad.exe Foo.txt" />
</Target>
实际上这个解决方案(在构建的情况下)将不起作用,因为DependsOnTargets是在BeforeTargets之前执行的。并且正是在 DependsOnTargets 中,真正的(CoreBuild)位于 :) 这就是他们发明“BeforeBuild”目标的原因;)
在这两种情况下,VS 检查是否有变化(文件是最新的)。如果没有任何改变,你为什么还要运行外部程序?如果此程序在文件(例如“内容”)上工作,则 msbuild 和 VS 应该将文件检测为过时并处理构建。
不幸的是,IDE(Visual Studio)有自己的方法来处理 msbuild 项目。主要机制是相同的,但是当它决定构建或不构建什么项目时,或者以什么顺序...... VS 的行为完全不同。
您可以使用外部工具并针对您的解决方案或项目运行“msbuild”。这也将编译“正确的方式”并且二进制文件不会有所不同,但您将拥有 MsBuild 的全部功能和潜力