web-dev-qa-db-ja.com

ビルド後のイベントのMSB3073エラーを修正するにはどうすればよいですか?

私は、ソリューションをビルドして生成されたDLLをbinフォルダーから別のフォルダーにコピーすることを要求するプロジェクトに取り組んでいます。これらは両方とも、私のマシンのCドライブにあります。これを実現するためにxcopyを使用するバッチファイルを作成しました。これは次のとおりです。

xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.dll" "C:\inetpub\wwwroot\AppServer\bin\"
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.pdb" "C:\inetpub\wwwroot\AppServer\bin\"

今、私はこのファイルの多数の反復を試しました。

C:\Users\scogan\Desktop\CopyFiles.bat

したがって、ビルド後のイベントコマンドラインは次のようになります。

call C:\Users\scogan\Desktop\CopyFiles.bat

デスクトップ上のフォルダーにある2つのテキストファイルを使用して、このバッチファイルを単独で実行しましたが、正常に動作します。また、自分でコピーする必要のあるファイルをそのまま使用して実行しましたが、これも正常に機能します。ただし、これをビルド後イベントとして実行しようとすると、次の出力が表示されます。

1>  Organizr -> C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Client\bin\Debug\Organizr.exe
1>  File not found - Organizr.Services.dll
1>  0 File(s) copied
1>  0 File(s) copied
1>  File not found - Organizr.Services.pdb
1>c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "call C:\Users\scogan\Desktop\CopyFiles.bat" exited with code 4.

調査を行った結果、エラーコード4は「初期化エラーが発生しました。十分なメモリまたはディスク容量がないか、コマンドラインに無効なドライブ名または無効な構文を入力しました」ということがわかりました。

また、MSB3073についても調べましたが、実際に役立つものはあまり見つかりませんでした。だから、私の質問は私が間違っているのですか?絶対パスはそれを台無しにしていますか?ここで助けていただければ幸いです。

25
Sean Cogan

さまざまなプロジェクトプロパティをいじってみたところ、プロジェクトのビルド順序が問題であることがわかりました。コピーしたいファイルを生成したプロジェクトはビルドされましたsecondですが、ポストビルドイベントとしてバッチファイルを実行していたプロジェクトはビルドされましたfirst代わりに2番目のプロジェクトにビルドイベントを添付しましたが、正常に機能します。皆さん、どうもありがとう。

23
Sean Cogan

ビルド後のイベントよりも、AfterBuildターゲットのMsBuildの「コピー」タスクを優先します。

このターゲットをプロジェクトファイルに追加し、PostBuildEventを削除します。

<Target Name="AfterBuild">
    <Copy SourceFiles="C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.*" 
          DestinationFolder="C:\inetpub\wwwroot\AppServer\bin\" 
          OverwriteReadOnlyFiles="true" 
          SkipUnchangedFiles="false" />
</Target>
15
Nicodemeus

価値のあることですが、私の場合の問題は、copyコマンドでディレクトリ区切り文字として '/'を使用したことが原因です。バックスラッシュを使用する必要があります。

9
darda

私の場合、プロジェクトをビルドして作成したdllはバックグラウンドでまだ使用されていました。アプリケーションを強制終了した後、xcopyは正常に機能しました。

5
ashish

これは遅すぎますが、後でそれを見る人々のために私の経験を投稿します。-MS VS 2010でも同じ問題がありました。スペースを含むビルドコピーコマンドの引数をポストするために引用符を付けることで解決しました!!!

[プロジェクトプロパティ]-> [構成プロパティ]-> [ビルドイベント]-> [ビルド後イベント]-> [コマンドラインの変更]

copy $(ProjectDir)a\b\c $(OutputPath)

コピー "$(ProjectDir)a\b\c" "$(OutputPath)"

3
Zakir

指定されたエラーは、ビルド後のイベントに関連しています。どういうわけかVSツールは、ファイルを宛先フォルダーにコピーできません。それには多くの理由があります。正確なエラーの原因を確認するには、[ツール]> [オプション]> [プロジェクトとソリューション]> [ビルドして実行]に移動し、「MsBuildプロジェクトビルド出力詳細」を「診断 "。実際の問題を検出するのに十分な情報が得られます。

3

正しいプロジェクトにアフタービルドを入れても問題が解決しない場合は、xcopyではなく「copy」を使用してください。これは私のために働いた。

1
Pandele Florin

コピーコマンドで何らかの問題が発生した場合、コピーコマンドを実行する前に行うべきことを次に示します。

  1. 管理者としてソリューションを開き、ソリューションを構築します。
  2. 「0個のファイルがコピーされました」などの問題がある場合は、ソースと宛先のパスを確認してください。間違ったパスを使用している可能性があります。 「コマンドプロンプト」で同じコマンドを実行して、正常に動作しているかどうかを確認する方が良いでしょう。
1
suraj kumar

インポートされたプロジェクトのビルド後イベント(プロパティダイアログのビルドイベントの下)には、定義されていない環境変数がありました。
Control Panel\All Control Panel Items\System\Advanced system settingsで適切な 環境変数を追加し、VS2017を再起動するだけで を実行するとエラーが解決しました。
また、 @Seans および複数のプロジェクトの競合/競合に関するその他の回答から、出力フォルダーに一時フォルダーを作成します。

like so

優先出力を生成するプロジェクトを選択します。

enter image description here

ビルド(再構築/クリーンなし)は迅速なソリューションです。

1
Laurie Stearn

私は次のことを行ってそれを解決しました:Visual Studioでは、プロジェクト->プロジェクトの依存関係に行きました

XXX.Testソリューションを選択し、XXX.Testソリューションのビルド後イベントがこのエラーを生成しないようにすることもXXXソリューションに依存することを伝えました(コード4で終了)。

よろしく、

1
Antonin GAVREL

テストプロジェクトでも同じ問題が発生しました。ビルド後のイベントが機能しなかった理由がわかりました。これは、$(ProjectName).exeコマンドを実行する前にファイルをコピーしており、これらのファイルの一部がテストプロジェクト自体に必要だったためです。したがって、最初のコマンドとして$(ProjectName).exeを移動するだけで問題が修正されます。

0
Awan

複数のプロジェクトを並行してビルドしていて、1つ以上のプロジェクトが同じファイルをコピーしようとすると、偶発的なエラーが発生する競合状態が発生するときに問題が発生することがわかりました。それを解決する方法は?

上記のように変更するだけで一部の人々の問題を解決できるため、多くのオプションがあります。より堅牢なソリューションは...

a。コピーされるファイルを制限します。つまり、xcopy $(TargetDir)」の代わりに...代わりにxcopy "$(TargetDir)$(TargetName)。*を実行します。 「...

b。エラーをキャッチして再試行します

:loop
xcopy /Y /R /S /J /Q  "$(TargetDir)$(TargetName).*" "somewhere"
if ErrorLevel 1 goto loop

c。 xcopyではなくユーザーrobocopy

d。おそらくビルド時間を増やすので、これをしたくないでしょうが、並列プロジェクトビルドの最大数を1に減らすことができます... enter image description here

0
Mick