4

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

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

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

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

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

/每

4

1 回答 1

2

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

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

您应该考虑是否要使用相同的互斥锁或两个不同的互斥锁来进行预构建和构建后资源访问(它们可以同时运行吗?)。

于 2014-04-30T11:00:46.033 回答