我需要在MsBuild中构建的项目之间同步对共享资源的访问。过去,当项目顺序运行并且在同一个过程中运行时,这不是问题。但是现在当MsBuild可以在多个线程和几个进程中运行项目构建时,我找不到实现此目的的方法。
基本上,我想要的是当我的项目开始构建时,我可以对资源进行一些操作。当它们都已经建成时,我可以再做一次操作。
如果首先想到我可以实现自定义任务并让每个项目都修改构建过程,那么在构建之前和构建之后注入任务。但由于它们可以并行运行,甚至可以跨进程运行,因此我似乎无法选择。
当试图解决这个问题时,我最接近的是当我在Microsoft.Build.Execution命名空间中找到BuildSubmission类时(http://msdn.microsoft.com/en-us/library/microsoft.build)。 execution.buildsubmission.aspx)。但我无法找到任何关于如何从我的自定义任务中与这些类进行交互的内容。
任何类型的输入或指针都会受到高度赞赏!
/每
答案 0 :(得分:0)
您可以在自定义MSBuild任务中实现资源访问,并通过named mutex保护它(这些可用于同步单独的进程)。也就是说,实现将首先获取互斥锁,检查是否需要触摸资源,然后才会对资源执行其工作并最终释放互斥锁。您可以使用AfterTargets or BeforeTargets强制此任务在构建之前或之后运行。
这样,如果使用此任务的两个项目同时到达预构建或后构建阶段,则只有其中一个项目将在资源上执行工作而另一个项目等待。当第一个项目释放互斥锁时,第二个项目将获取它,实现作业已经完成并立即释放互斥锁,而不会触及资源。
您应该考虑是否要为预构建和构建后资源访问使用相同的互斥锁或两个不同的互斥锁(它们可以同时运行吗?)。