【VB.NET】DLL のデバッグがうまくいかない

Visual Studio Community 2017 で VB.NET のクラスライブラリ(.NET Framework)を作成してそのデバッグを行ったとき、つまづいた点を記載します。

dll のデバッグの準備(これでいい?)

1. EeoLcs.dll というクラスライブラリ(.NET Framework)を作成。

必要なコードは記述してビルド済みということにする。

2. EeoLcs を含むソリューションに、デバッグ用の実行可能プロジェクト TestApp を追加(今回は WPF アプリとして追加した)。

3. TestApp の参照に EeoLcs.dll を追加(プロパティの「ローカルにコピー」は True にする)。

4. TestApp のコードに、EeoLcs.dll の関数を呼び出すコードを記述。

5. ソリューションを右クリックしてプロパティを選択し、シングルスタートアッププロジェクトとして TestApp を選択。

これで EeoLcs(dll)のデバッグの準備終わり!と思ったら違った~~、というお話。

つまづいた点

さっそく EeoLcs(dll)のデバッグを開始しようとしたら、問題が発生した。

「この参照を解決できませんでした」というエラーが出る

Visual Studio の上部メニューの[ビルド]>[ソリューションのリビルド]を実行してみたら、Visual Studio が下記のような文句を言った。

この参照を解決できませんでした。アセンブリ "EeoLcs" が見つかりませんでした。アセンブリが間違いなくディスクに存在することを確認してください。 コードにこの参照が必要な場合、コンパイル エラーが発生する可能性があります。

えーっと、リビルドすると dll がいったん削除されてから再生成されるはずだから、 dll が消えてるときに TestApp のリビルドが始まってエラーが起きてるのかな?と思った。

そうならば、プロジェクトのビルドの順番が問題なのか? なら、EeoLcs(dll)のほうが先にリビルドされれば良いんだろう。

というわけで、ソリューションのところで右クリックして[プロジェクトのビルド順序]を表示してみる。

あれ? ビルドの順序は問題ないみたいだけど? ちゃんと EeoLcs(dll)が先になってるよ。

・・・そう思ったんだが、どうも、この[プロジェクトの依存関係]ダイアログはちょっと(誤解を招く)クセがあるようだ。

よく見るとダイアログの下に[ビルド順序を変更するには依存関係タブを使用します。]と書かれている。設定は依存関係タブでする必要があるらしい。それにダイアログのタイトルを見ると「プロジェクトの依存関係」と書いてある。どうも「ビルドの順序」タブはオマケ扱いというか参照用みたいなものかな。

依存関係タブを選択してみる。「この“依存先”のところにチェックを入れればいいのかな?」と思ってチェックを入れて[ソリューションのリビルド]を試してみたら、「この参照を解決できませんでした」のエラーが出なくなった。これで解決♪と思った。(しかしこれではダメなことが後で判明する)。

ちなみにだけど、ソリューションを右クリックして[プロジェクトの依存関係]を選択しても、上記のダイアログのタブを開くことができる。

dll に加えた修正が反映されない

「この参照を解決できませんでした」のエラーが出なくなったので、Visual Studio の[デバッグの開始](F5)を選択してデバッグをすることにした。しかし、EeoLcs(dll)のコードに修正を加えてから F5 を押してデバッグをしても、EeoLcs(dll)に加えた修正が反映されてないことに気付いた。何度 F5 を押しても同じ。

それで調べた結果、Visual Studio 上部メニューの[ツール]>[オプション]>[プロジェクトおよびソリューション]>[ビルド/実行]で、[実行時に、スタートアッププロジェクトおよび依存関係のみをビルドする]のチェックを外してデバッグしてみた(あとで分かったが、今回のケースではこのチェックを外す必要は無い)。

そうすると、今度は、F5 を押しても EeoLcs(dll)のコードに加えた修正がすぐに反映されないのは同じだが、再度 F5 を押すと今度は反映されている。EeoLcs(dll)を修正した直後にデバッグをしても、1つ前の古い EeoLcs(dll)が参照されてしまってるらしい。ただ、EeoLcs(dll)がビルドされているのは間違いないようだ。

ということは・・・TestApp のほうが先にビルドされちゃってるってこと?

再度[プロジェクトの依存関係]ダイアログを表示して[ビルドの順序]を確認すると、そうなっていた。これではダメなんだ。

え~と、順序を変える(EeoLcs を先にビルドする)には・・・。

[依存関係]タブに戻って、付いていたチェックを外す。次に[プロジェクト]として TestApp の方を選択して[依存先]の EeoLcs にチェックを入れる。

この[依存関係]タブの設定状態はリアルタイムで[ビルドの順序]タブに反映される。[ビルドの順序]タブを確認してみる。

オッケー。EeoLcs(dll)が先になりました。

これでデバッグをしてみると、今度は dll に加えた修正が即座に反映されるようになりました。

まとめ

この記事の最初に記載した「dll のデバッグの準備(これでいい?)」が終わったら、[プロジェクトの依存関係]の[依存関係]タブで依存関係を設定し(チェックを入れる)、[ビルドの順序]タブで順序が正しいことを確認する。順序が正しくない場合は[依存関係]タブで設定をやり直す。

[実行時に、スタートアッププロジェクトおよび依存関係のみをビルドする]のオプションは今回は関係なかったが、念のため頭の隅に置いておくと良いかもしれない。

その他の注意点

ちなみにだけど、dll 等の依存関係にあるプログラムの修正が即座に反映されないときは、Visual Studio 上部メニューの[ツール]>[オプション]>[プロジェクトおよびソリューション]>[ビルド/実行]で、[実行時に、プロジェクトが最新の状態でないとき]が[常にビルドする]になっているかも確認したほうが良いかもしれない。

コメントの投稿

avatar
  購読する  
通知を受け取る対象