使用TFS Build 2010,我为几个项目构建了运行devenv.com的进程。之后,我希望使用带有“File.Copy”的C#Custom Build Activities从输出文件夹中复制所有二进制文件。但是,它使用文件的第一个副本将此异常抛给了我:
The process cannot access the file 'C:\Test\BuildServer\Sources\Library\LibraryInstall\LibraryInstall\Release\LibraryInstall.msm' because it is being used by another process.
似乎该文件仍由devenv.com使用。知道怎么样?除了File.Copy之外,有没有更好的方法来复制它而不管文件状态如何?
==
我发现了一种丑陋的方式:
Process proc = new Process();
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = @"C:\WINDOWS\system32\xcopy.exe";
proc.StartInfo.Arguments = "/Y " + Path.Combine(sourcesDirectory, fileName) + " " + binariesDirectory;
proc.Start();
答案 0 :(得分:0)
Devenv是一个激进的文件柜。如果您可以通过创建MSBuild文件并绕过devenv来构建项目,那么您将会变得更好。有些项目类型只能用devenv构建,但是你没有指定你正在使用的项目类型,所以这可能不是一个选项。
MSBuild具有一个名为“节点重用”的功能,通过该功能,它可以创建最多15分钟的流程,作为后续构建的优化。可能是节点重用与devenv的文件锁定行为相结合会给你带来麻烦。
您还没有明确说明您是如何执行构建的,但如果涉及MSBuild,您可以尝试指定/ nodereuse:false选项以禁用此功能。
我还看到流氓MSBuild和devenv进程挂起到文件,他们可以挂起并永远保持不变,直到你杀死它们,如果你的构建中存在模糊的异常。
答案 1 :(得分:0)
我很少有业余爱好者。不要在我的答案上减去=)
首先,看看this answer稍微改变你的算法
这是另一个搜索,请看一下this question。
这是最后一个和核心long shot。
最诚挚的问候......