Visual studio 2013 Visual Studio添加始终运行的预生成事件(C#project)

Visual studio 2013 Visual Studio添加始终运行的预生成事件(C#project),visual-studio-2013,msbuild,pre-build-event,Visual Studio 2013,Msbuild,Pre Build Event,在我的项目中,我运行一个外部工具来更新一些二进制文件。这些文件作为“内容”包含在项目中 目前,该工具设置为在C#项目属性中的“预构建事件”期间运行。不幸的是,只有当项目过期时才会执行此事件,这不是我需要的 我总是在我的项目中使用“重建”而不是“构建”,以此来解决这个问题,但这既单调又缓慢 我需要始终执行此工具,无论项目是否是最新的。实际上,甚至在MSBuild确定项目是否是最新的之前,因为该工具修改了项目中包含的一些文件,从而影响了最新的检查结果 有合适的方法吗?在项目级别,您有三个选项: 1)

在我的项目中,我运行一个外部工具来更新一些二进制文件。这些文件作为“内容”包含在项目中

目前,该工具设置为在C#项目属性中的“预构建事件”期间运行。不幸的是,只有当项目过期时才会执行此事件,这不是我需要的

我总是在我的项目中使用“重建”而不是“构建”,以此来解决这个问题,但这既单调又缓慢

我需要始终执行此工具,无论项目是否是最新的。实际上,甚至在MSBuild确定项目是否是最新的之前,因为该工具修改了项目中包含的一些文件,从而影响了最新的检查结果


有合适的方法吗?

在项目级别,您有三个选项:

1) 预构建操作

<PropertyGroup>
  <PreBuildEvent>notepad.exe Foo.txt</PreBuildEvent>
</PropertyGroup>

notepad.exe Foo.txt
2) 正常预构建目标

<Target Name="BeforeBuild">
  <Exec Command="notepad.exe Foo.txt" />
</Target>

3) “附加”到“构建”目标(如stijn建议的)


实际上,这个解决方案(在构建的情况下)将不起作用,因为DependsOnTargets是在BeforeTargets之前执行的。在DependsOnTargets中,真正的(CoreBuild)位于:) 这就是他们发明“构建前”目标的原因;)


在这两种情况下,VS检查是否有更改(文件是最新的)。如果什么都没有改变,为什么还要运行外部程序?如果此程序在文件(例如“内容”)上工作,msbuild和VS应检测到文件已过期,并处理生成


不幸的是,IDE(VisualStudio)有自己的方法来处理msbuild项目。主要的机制是相同的,但是当决定构建什么项目或者不构建什么项目,或者按照什么顺序构建时。。。与行为完全不同


您可以使用外部工具对解决方案或项目运行“msbuild”。这也将以“正确的方式”编译,二进制文件也不会有什么不同,但您将拥有MsBuild的全部功能和潜力。在项目文件中定义此属性:

<PropertyGroup>
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup> 

真的
然后,无论项目是否是最新的,每次都将执行PreBuildStep


Visual Studio似乎正在绕过对MSBuild的常规最新检查,并使用某种更快的自定义检查,但会产生破坏自定义生成目标的副作用。

使用Visual Studio for Mac时,这些解决方案都不适用于我。 我想在构建项目之前运行一个bash脚本,但是由于我使用了Xamarin,有些事情变得不正常了。我尝试了所有不同类型的目标,甚至在项目选项中尝试了CustomCommands,但仍然会遇到MSbuild只是自动运行或在生成之前没有真正运行的问题

您可以在主项目之前编译的单独项目中运行预生成事件

  • 创建一个新项目,并将其命名为“PreBuildEvent”
  • 将如上所示的MSbuild目标/命令添加到每个属性组/生成配置的新PreBuildEvent.csproj文件中
  • 在最初要执行预构建工作的项目中,添加对此新项目的引用
  • 这个新项目将首先构建,执行任何预构建事件,一旦构建了这个项目,它将启动原始项目的构建。这是因为当您添加对项目的引用时,VisualStudio确保以正确的顺序构建它们

  • 还有一个额外的预构建事件没有在这里讨论。通常代码分析器使用它来检查代码分析器是否由NuGet下载

    因此,如果您想在代码分析器之前执行某些操作,您需要使用该目标

    您只需在.csproj文件的
    节点下添加
    节点:

    <Target Name="DownloadNugetPackages" BeforeTargets="PrepareForBuild">
        <Exec Command="notepad.exe Foo.txt"/>
    </Target>
    
    
    

    PrepareForBuild事件将在预生成事件之前运行。

    否,在将项目加载到IDE中时修改项目不会有好结果。当然还有更好的办法,你的问题对我们没有帮助。@HansPassant也许我对这个问题设计过度了。归结起来就是:在生成之前总是有一个命令运行吗?对于C++项目,可以使用一个带有“代码> BEFFETEGARGET =“BudidGealthStudioSukes”< /Cuth>属性)的目标来实现这一点。对于C#来说,您可以做类似的事情,只需找出在构建中调用的许多目标中,您将使用BeforeTargets属性的哪个。运行详细的构建并检查输出或开始查看Microsoft.CSharp.targets等。但是正如Hans所说:结果可能不是您所期望的。当在Visual Studio的鼻子底下更改磁盘上的源代码时,会导致各种有趣的行为,您需要关闭HostCompiler服务(这会让Visual Studio慢一点):对于C#来说,它将是
    BuildDependsOn
    组,或者您可以扩展解决方案本身:(参见第二个答案,接受的答案不是您想要的)。我需要运行外部程序,因为它将大量文件处理为单个二进制文件。将所有这些文件添加到Visual Studio项目是不可行的,因此它们不在项目中。MSBuild对此一无所知。外部工具有自己的最新检查机制,用于检查这些文件是否需要processing,但它首先需要运行,而VS不想合作。这是不是要求太多了…你真的应该添加一个带有BeforeTargets=“BeforeBuild”的#4示例。这对很多软件都很有帮助,如果有两个同名的目标,只会使用后者。因此,许多项目已经有了“BeforeBuild”目标,这可能会导致大量的无声问题。最好创建自己的命名目标,并为其配备
    BeforeTargets=“Build”
    attribute.M
    <Target Name="DownloadNugetPackages" BeforeTargets="PrepareForBuild">
        <Exec Command="notepad.exe Foo.txt"/>
    </Target>