2009-07-22 14 views
17

私のVisual Studioソリューションには、Webアプリケーションと単体テストアプリケーションが含まれています。私のWebアプリケーションはlog4netを使用しています。私は私のソリューションを構築するためにコマンドラインからmsbuildを使用できるようにしたい。しかし、コマンドラインからソリューションをビルドするたびに、log4net.xmlをテストプロジェクトのbinディレクトリにコピーできないため、ビルドエラーが発生します。Visual StudioがXMLドキュメントファイルをbinディレクトリにロックしないようにするにはどうすればよいですか?

エラーメッセージは次のとおりです。

「 'ビン\デバッグ\のlog4net.xml' にパスへのアクセス「 '\ビン\のlog4net.xmlを' ファイルをコピーすることができません\ビン\のlog4net.xml ' 否定された。"

Visual Studioがこのファイルをロックしているようですが、なぜそれが必要なのかわかりません。 VSがXMLドキュメントファイルをロードしたプロジェクトでロックしないようにする方法はありますか?

答えて

1

私も、Visual Studioにこの問題を持っていました。 MSBuildではなくNAntを使用しますが、問題は同じです。私はxmlドキュメントをコピーするときにビルドファイルを修正して失敗を無視するようにして回避することができました。

xmlファイルがまだロックされているため、実際には元の問題は解決されませんが、xmlドキュメントの実際の内容はあまり頻繁に変更されないため、この回避策は十分です。

0

基本的にbinフォルダにファイルをチェックしないでください。悪い考えです。

このファイルを別のディレクトリにドロップし、そこから参照するか、またはライブラリからそれを使用するコードを配置し、そのビルドイベントをビルドディレクトリにコピーして参照することができます。

MSBuildのは、あなたのためにwebprojects binディレクトリにあることをコピーします:)

どうしてもビンディレクトリに持っていない限り、私たちは、binディレクトリにコンテンツをチェックインする人たちと、この正確な問題を持っているでチェックすべきではないのいずれかこれらのロック問題を避けるために、そこに.refreshファイルを持っているだけです。返事が遅れ上

ビット、申し訳ありません:)

+0

元の質問はどんなことを示すものではありませんでしたファイルはbinディレクトリにチェックインされ、ビルド中にそこにコピーされただけです。つまり、一般に、ファイルはプロジェクトのbinディレクトリにチェックインされてはならないということに同意します。 –

+0

ああ申し訳ありませんが、私はそれを再読して、あなたは正しいです:) 私はしかし、あなたがこれらのタイプのプロジェクトで投稿と事前ビルドのイベントを使用することができないことは非常に厄介なことを見つけました。依存ディレクトリを持つことで問題を解決し、msbuildは常にアセンブリを正しくコピーします。 –

1

Krystanは書きました:あなたは別のディレクトリにこのファイルをドロップし、そこからそれを参照するか、ライブラリにそれを使用する場所のコードとそのbinディレクトリにコピーし、その上でポストビルドイベントを持つことができ

をし、参照してください。

xmlファイルのロックに関する問題は、プロジェクトのbinディレクトリではなく、外部参照ディレクトリにあります。新しいバージョンが利用可能なTortoiseSVN-> Updateを実行するときにヒットしました。これは、VSがインテリセンス用にファイルを使用しているためだと仮定します。

TortoiseSVN-> Updateのためにこのロックの問題に遭った人のために、私は現在アップデート前に問題のファイルを削除する事前更新フックを試しています(アップデートが必要ない場合は復元されます)これまでのところこれはうまくいくようですが(確かに奇妙なことですが)、確かに十分にテストしていません。信頼できると判断された場合、この回答が更新されます。

ここでMSはVS 2010で修正することを望んでいます。

+0

私はまったく同じ問題に直面しています。あなたの回避策はうまくいきますが、TSVNがファイルを削除しても、それを上書きしないのは奇妙です。 –

8

私は、次の解決策見つけた:CMDスクリプトを実行VSポストビルドイベントでまたはNAntの/ MSBuildのスクリプトで を

handle.exe -p devenv [Path to the folder with locked files] > handles.txt 

FOR /F "skip=5 tokens=3,4 delims=: " %%i IN (handles.txt) DO handle -p %%i -c %%j -y 

handle.exeは、スクリプトのhttp://technet.microsoft.com/en-us/sysinternals/bb896655.aspx

最初の行ここにありますhandles.txtへのダンプVSでロックされたファイルのすべてのハンドル 2行目のハンドルIDがファイルから読み込まれ、ハンドルを強制終了します

スクリプトが実行された後、ファイルが残っている可能性があります

+0

優れた答えです。魅力的なように動作し、VSを誤動作しているビルドスクリプトを書くのではなく、Visual Studioが動作しているかのように、ビルドスクリプトを書くことができます。 – Adam

+1

私はハンドル3.46を使用していますが、 'tokens = 3,4 'を' tokens = 3,6'に変更しなければなりませんでした。その後、それは完璧に感謝しました。 – OlduwanSteve

2

xml & pdbファイルを出力から省略しても問題がなければ、コマンドラインで/p:AllowedReferenceRelatedFileExtensions=noneをmsbuildに渡すことができます。

(関連答えhttps://stackoverflow.com/a/8757941/251011のおかげで)

EDIT:あなたも、このエラーが発生したdllファイルに問題がある場合、私は最近、環境変数解決策を発見:https://stackoverflow.com/a/23069603/251011

+1

また、ほぼ5年後にVSがまだこのようにロックしていて、まだ*なぜ*わからないのかちょっと面白いです。 –

関連する問題