QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

VS.NETでのDLLデバッグ

いつもお世話になっております。
この度は、みなさんがVS.NETでどのようにしてDLLプロジェクトをデバッグしているかを参考にさせていただきたいと思い、投稿しました。
具体的には同じソリューション内にEXEプロジェクトとDLLプロジェクトが一つずつあって、DLLのデバッグをソリューション内のEXEから呼び出して行いたい場合です。
普通にDLL内のソースコードにブレークポイントを置いただけだと、ブレークポイントがうまく機能しません。デバッグを開始するとブレークポイントが警告グリフ(丸印の上に?印)になって、「このドキュメントのシンボルが読み込まれていません」と言われています。
ヘルプで調べてみると、以下のようにいくつかそれらしいものが載っています。

この位置のコードを読み込めないため、ブレークポイントを設定できません。コードが後で (クラスまたは DLL の読み込み時などに) 読み込まれると、ブレークポイントが有効になります。

ハード ディスクに DLL のコピーが 2 つ以上ある場合、ブレークポイントは機能しません。

特に、2 つ以上の DLL のコピーが Windows ディレクトリにある場合は、デバッガを混乱させる原因になります。デバッガが DLL のコピーを読み込むときに、Windows が別のコピーを読み込んでいる可能性があります。デバッガに特定の DLL を読み込ませることはできません。したがって、パス、現在のディレクトリ、および Windows ディレクトリには、DLL のただ 1 つのバージョンを置くようにしてください。

この2つから、プロジェクト内のDLLは読み込まれておらず、違うDLLが読み込まれているのではないかと思って探してみると、どうもEXEからDLLへ参照設定を行ったときに自動的にEXEがあるフォルダにDLLがコピーされるような設定がデフォルトになっていました。DLLを自動的にコピーしないようにする設定があったので、そうしてみると今度はDLLが見つからないというエラーが起こりました。これも調べてみるとプライベートアセンブリに関しては、アプリケーションのベースディレクトリ以下に配布しないとだめみたいで、今回の場合プロジェクトフォルダが同じ階層にあるため、当然、EXEがある場所(....\bin\debug\XXX.exe)より下位にDLLはありません。
Exeがある場所にDLLプロジェクトを移動してもいいのですが、ちょっとスマートじゃありません。
どなたか、DLLプロジェクトのデバッグでよい方法をご存知でしたら、是非ご指導お願いいたします。

質問者:Dr. K

回答

リリースビルドになっていませんか?

投稿者:いのつち

編集 履歴 (0)

え?できていますけど?
ただ、C++でDLLを作ると、ややこしかったように思います。VB.NET、C#のWindows Formだと、特に何の苦労もしていません。WebサービスやWebアプリケーションにすると、おっしゃるようなことが起こったように思います。このときは、テスト用のWindows Formを用意して、そちらでデバッグしています。

投稿者:Jitta

編集 履歴 (0)

ずっとデバッグモードで実行していましたが、突如できるようになりましたお騒がせしました。(どうも途中で名前空間やアセンブリ名を変えたのがまずかったのかな・・・)

投稿者:Dr. K

編集 履歴 (0)

私のところでも突如できなくなったりします。
以下のことを確認するようにしています。

1.リリースモードになっていないか?
2.デバッグ情報(pdb)の作成がOFFになっていなか?

たいていは直るのですがたまに難物がいたりします。
そのときはお手上げだったりします。

投稿者:FOX

編集 履歴 (0)

こんにちは。
便乗質問です。

Dr. Kさんの書き込み (2003-05-29 23:13) より:

どうもEXEからDLLへ参照設定を行ったときに自動的にEXEがあるフォルダにDLLがコピーされるような設定がデフォルトになっていました。DLLを自動的にコピーしないようにする設定があったので、そうしてみると今度はDLLが見つからないというエラーが起こりました。

VC++.netには、このような「自動的にEXEがあるフォルダにDLLがコピーされる」機能は無いのでしょうか?
いつも腕力でターゲットフォルダにDLLをコピーしています。
皆さんはどのようにされているのでしょうか?

投稿者:Kuma

編集 履歴 (0)

VC++.netには、このような「自動的にEXEがあるフォルダにDLLがコピーされる」機能は無いのでしょうか?

いつも腕力でターゲットフォルダにDLLをコピーしています。

皆さんはどのようにされているのでしょうか?

C++の.NETのプロジェクトは自動的にやってくれてます。
その他のプロジェクトはやったことないです。

自動的化できる部分はビルドイベントを使っています。

ビルド前,リンク前,ビルド後にコマンドを打つことができますしね。

投稿者:FOX

編集 履歴 (0)

FOXさん、皆さんお世話になっています。

FOXさんの書き込み (2003-05-30 16:37) より:

C++の.NETのプロジェクトは自動的にやってくれてます。

その他のプロジェクトはやったことないです。

C++ の MFCプロジェクトのことを、想定しています。
新規プロジェクトを作り、使いまわしクラス群のDLLを既存プロジェクトと追加しただけでは、自動ではやってくれません。

ちなみに、.netプロジェクトに既存DLLプロジェクトを追加してみましたが、自動で設定はできていないようです。
新規プロジェクトとして追加をすれば、自動で設定できるのでしょうか?

確かに、ビルド後にコピーをやらせれば、複写はできることがわかるのですが、設定で自動でやれるなら使いたいなと思っています。
私のやり方が、おかしいのでしょうか?

投稿者:Kuma

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。