Visual C# 2010 Expressでビルド後に実行するコマンドラインを設定してDLLを自動的にdebugフォルダにコピーするようにしようとしたところ以下のようなエラーが出た。
エラー 2 コマンド “copy DLL\io.dll bin\Debug\
::copy C:\Programs\00_編集中\\DLL\io.dll C:\Programs\00_編集中\bin\Debug\
” はコード 1 で終了しました。 Main
出力: ビルド
c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3717,9): error MSB3073: コマンド “::copy C:\Programs\00_編集中\\DLL\io.dll C:\Programs\00_編集中\bin\Debug\
c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3717,9): error MSB3073: copy DLL\io.dll bin\Debug\
c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3717,9): error MSB3073: ” はコード 1 で終了しました。
このとき用いていたコマンドは、以下の通りだ。
copy DLL\io.dll $(OutDir)
これを、以下のように絶対パスで指定するように変更したところエラーはなくなった
copy $(ProjectDir)\DLL\AIOdll\caio.dll $(TargetDir)
何が違うのかコマンドの内容を見てみようと、コマンドを以下のようにしてみた。
echo copy $(ProjectDir)\DLL\AIOdll\caio.dll $(TargetDir)
すると、以下のように出力された。
copy C:\Programs\00_編集中\\DLL\io.dll C:\Programs\00_編集中\bin\Debug\
このコマンドは問題ない。
よく見ると、カスタムビルドのビルドマクロを相対パスで記述した時は、コピーコマンドが「::copy」となっている。
これが原因ってことか・・・?^^;;;
何かC#のバグくさいなー。追記:
copyコマンドだと、常にファイルをコピーするので大量にDLLを指定しているとコンパイルが遅くなってしまう。
自分のPCにはCygwinも入ってるのでcpコマンド使うことにした。
コマンドは、以下のようにした。
cp -u -p $(ProjectDir)\DLL\io.dll $(TargetDir)
これをコンパイル後に常に実行するようにしておけば、DLLの更新日が新しくなっていれば自動的に更新されることになる。
追追記(2011/11/04):
cygwinのcpコマンドだと、日本語のようなマルチバイト文字が入っているディレクトリをうまく扱えないバグがあることが分かった。
やっぱunix系のコマンドはマルチバイトに弱いなー。。。
というわけで、最良い何か無いかなーと探してみたら在りました。
ちゃらららったたー「robocopy」!!(ドラえもん風に)
ぶっちゃけファイル、ディレクトリコピーコマンド最強ではないかと思われる。
(VISTA以降は標準で入ってるそうですが、XP以前のOSはここから落として下さい。)
こいつ使って、以下のようにビルド後コマンドを実行するようにした。
これで、更新されていた場合のみコピーする。
robocopy $(ProjectDir)DLL\IO\ $(TargetDir) io.dll /COPYALL /XX /XO /NP
robocopy $(ProjectDir)OpenCVSharp\ $(TargetDir) /COPYALL /XX /XO /NP
robocopy $(ProjectDir)DLL\OpenCV2.3.1dll\ $(TargetDir) /COPYALL /XX /XO /NP
でも、コマンド編集した後デバッグクリックすると、一回はプログラム起動しないんだけど、もう一回デバッグ押すと今度はちゃんと起動する。。。
何で、だろ???
それに、きちんとコピーは出来ているようだが、以下のようにエラーが出てるのも気になる・・・
エラー 1 コマンド “robocopy E:\Programs\00_編集中\DLL\IO\ E:\Programs\00_編集中\bin\Debug\ io.dll /COPYALL /XX /XO /NP
robocopy E:\Programs\00_編集中\OpenCVSharp\ E:\Programs\00_編集中\bin\Debug\ /COPYALL /XX /XO /NP
robocopy E:\Programs\00_編集中\DLL\OpenCV2.3.1dll\ E:\Programs\00_編集中\bin\Debug\ /COPYALL /XX /XO /NP
” はコード 2 で終了しました。 Main
誰か、詳しい人教えて下さい・・・m(_ _)m
備考: 旧ブログ移植
コメント