TFSBuild 2010:コンパイル後にFile.Copy C#snippetsが例外をスローする

TFS Build 2010では、いくつかのプロジェクトに対してdevenv.comを実行するビルドプロセスがあります。その後、すべてのバイナリを "File.Copy"でC#カスタムビルドアクティビティを使用して出力フォルダからコピーします。しかし、ファイルの最初のコピーでこの例外を私に捨てました:

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();
3
依存関係を正しくセットアップしたり、並列ビルドを実行したりしていないようです。
追加された 著者 leppie,
ビルドプロセスにポストビルドタスクを追加できませんか?
追加された 著者 Jahan Zinedine,
buildinのコピータスクには、再試行と再試行の設定があります。それは実際の問題を隠していますが、それは醜い迅速な修正かもしれません。 msdn.microsoft.com/en-us/library/3e54c37h.aspx
追加された 著者 rene,
いいえ、それは順序です...
追加された 著者 lannyboy,

2 答え

私はアマチュアのものはほとんどありません。私の答えにマイナスを入れないでください)=)

まず、この回答あなたのアルゴリズムを少し変更する

  • 同じ醜い方法を含むバッチファイルを作成できます それ。次に、このバッチファイルをC#から呼び出します。
  • FileStream を使用することができます。 ..バイナリ読み書き可能
  • おそらく、あなたのプロジェクトにVBリファレンスをインポートして、(非 )
  • または、このエラーを起こしたプロセスを直接killしてください。

そして別の検索があります。見てくださいこの質問も参照してください。

これは最後のハードコアです。ロングショット

宜しくお願いします...

0
追加された

Devenvは攻撃的なファイルロッカーです。 MSBuildファイルを作成してdevenvをバイパスしてプロジェクトを構築することができれば、より良い結果が得られます。しかし、いくつかのプロジェクトタイプはdevenvでしか構築できませんが、使用しているプロジェクトタイプを指定していないので、これはオプションではないかもしれません。

MSBuildには「ノードの再利用」という機能があり、それによって後続のビルドの最適化として最大15分間ハングアップするプロセスが作成されます。ノードの再利用とdevenvのファイルロック動作が混乱している可能性があります。

ビルドの実行方法を正確にはっきりさせることはできませんが、MSBuildが関わっている場合は、/ nodereuse:falseオプションを指定してこの機能を無効にすることができます。

私は悪意のあるMSBuildとdevenvプロセスがファイルにぶら下がっているのを見たことがあります。ビルドにあいまいな例外がある場合、それらを強制終了するまで、ハングアップして永遠に残ることがあります。

0
追加された