如何在MsBuild中同步项目之间的共享资源

如何在MsBuild中同步项目之间的共享资源,msbuild,task,synchronize,Msbuild,Task,Synchronize,我需要在MsBuild中构建的项目之间同步对共享资源的访问。在过去,当项目在同一过程中连续运行时,这不是问题。但现在,当MsBuild可以在多个线程和多个进程中运行项目构建时,我找不到实现这一点的方法 基本上,我想要的是,当我的项目开始构建时,我可以对资源进行一些操作。当他们都建到最后,我可以再做一次手术 如果首先想到我可以实现一个定制任务,让每个项目修改构建过程,在构建之前和构建之后注入任务。但由于它们可以并行运行,甚至可以跨进程运行,我似乎无法选择 当我试图弄清楚这一点时,最接近我的是在Mi

我需要在MsBuild中构建的项目之间同步对共享资源的访问。在过去,当项目在同一过程中连续运行时,这不是问题。但现在,当MsBuild可以在多个线程和多个进程中运行项目构建时,我找不到实现这一点的方法

基本上,我想要的是,当我的项目开始构建时,我可以对资源进行一些操作。当他们都建到最后,我可以再做一次手术

如果首先想到我可以实现一个定制任务,让每个项目修改构建过程,在构建之前和构建之后注入任务。但由于它们可以并行运行,甚至可以跨进程运行,我似乎无法选择

当我试图弄清楚这一点时,最接近我的是在Microsoft.Build.Execution命名空间中找到BuildSubmission类(http://msdn.microsoft.com/en-us/library/microsoft.build.execution.buildsubmission.aspx). 但是我在自定义任务中找不到关于如何与这些类交互的任何信息

任何类型的输入或指向某个方向的指针都将受到高度赞赏


/根据

您可以在自定义MSBuild任务中实现资源访问,并通过(这些可用于同步单独的进程)对其进行保护。也就是说,实现将首先获取互斥体,检查是否需要触摸资源,然后才对资源执行其工作,最后释放互斥体。可以使用在生成之前或之后强制运行此任务

这样,如果使用此任务的两个项目同时到达预构建或后构建阶段,则其中只有一个将在另一个等待时对资源执行工作。当第一个项目释放互斥体时,第二个项目将获取互斥体,意识到作业已经完成,并立即释放互斥体,而不接触资源


您应该考虑是否使用相同的互斥体或两个不同的用于预构建和后生成的资源访问(它们可以同时运行吗?)。可能还有其他的解决方案。好吧,这个资源实际上不是一个单一的资源,但是让我们假设它是一个用于说明的数据库。当构建属于共享解决方案的一组项目时,我希望确保在构建之前,到达预构建注入点的第一个项目在该数据库上执行某些操作,并且所有后续项目都知道该操作已经完成,因此它们会跳过同样的操作。构建会话结束时的另一种方法是:在构建最后一个项目之后,它对数据库执行一些其他操作,也是独占的(其他项目不这样做)。我们让过程成为资源。我们有X个项目的解决方案。构建解决方案时(在MsBuild之上使用MsBuild或VS),我们希望确保在任何项目开始构建之前,关闭一个进程(“Foo.exe”),并且在最后一个进程完成构建之后,我们希望确保再次启动相同的进程。我们拥有所有MsBuild标准任务和定制任务的选项。我们可能希望通过修改BuildDependsOn属性,在构建之前和之后注入自定义任务。