クラスライブラリ(DLL)プロジェクトのデバッグ方法


VisualStudioでクラスライブラリ(DLL)を作成するプロジェクトでデバッグ開始すると、「クラス ライブラリの出力タイプを持つプロジェクトを直接起動することはできません」と怒られる。。。。
この対処方法と、ソースを修正したらF5を押すだけで通常のアプリと同じ感覚でデバッグできるようにする手順をご紹介します。



DLLは単体では動作しないため、VisualSudioのデバッグ開始(F5)を行っても以下のように怒られてしまいます。

---------------------------
Microsoft Visual Studio
---------------------------
クラス ライブラリの出力タイプを持つプロジェクトを直接起動することはできません。

このプロジェクトをデバッグするには、ライブラリ プロジェクトを参照するこのソリューションに実行可能なプロジェクトを追加し、
それをスタートアップ プロジェクトとして設定します。
---------------------------
OK   
---------------------------

対処方法としては、以下手順となります。手順1、手順2は自動化可能です。
1 DLLを親アプリケーションから参照できるディレクトリに格納する
2 親アプリを起動する
3 親アプリから呼び出しを受けたDLLの機能をデバッグする

例として、当ブログで作成法をご紹介してるNCVプラグインの場合、親アプリはNCV本体、
棒読みちゃんプラグインの場合、親アプリは棒読みちゃん本体になります。
参考)
 NiconamaCommentViewer(ニコ生コメントビューア)のプラグイン作成法 1
 棒読みちゃんプラグインの作成法 01

 
 

手順1 DLLを自動的にコピーする


通常、ソースコードを編集・ビルドする度に、DLLを適切なディレクトリに格納する必要があり、手作業では面倒です。
 
以下の手順でこの作業を自動化します。
・ソリューションエクスプローラ->プロジェクト名で右クリック->プロパティ->ビルドイベント->ビルド後に実行するコマンドライン の欄に以下を入力します。

copy $(TargetDir)$(TargetFileName) "C:\Program Files\hogehoge\plugins\"

この設定により、ビルド完了すると、自動的にDLLが親アプリのDLL配置ディレクトリにコピーされます。
(“C:\Program Files\hogehoge\plugins\” は 親アプリのDLL格納ディレクトリに読み替えて下さい)
(MFC等では、カスタムビルドと呼ばれる設定に相当します。)
 
 

手順2 親アプリを起動する


プロセスにアタッチ を利用する場合

親アプリをダブルクリック等で起動し、VisualStudioのデバッグ->プロセスにアタッチを選択します。
選択可能なプロセス一覧から、起動中の親アプリを選択し、アタッチを押下します。
これでデバッグが可能な状態となりますが、毎回親アプリを起動してプロセスにアタッチを選択するのは面倒です。
以下の自動化がオススメです。
 

自動化する場合

デバッグ開始(F5)を指定すると、自動的に親アプリが起動するように設定します。
(プロセスへのアタッチも自動で行われます)
ソリューションエクスプローラ->プロジェクト名で右クリック->プロパティ->デバッグ->開始動作->外部プログラムの開始(X) を選択し、
親アプリのパスを入力します。(例:C:\Program Files\hogehoge\hoge.exe)
 
 

手順3 デバッグする


手順1と手順2の自動化を併用することで、以下手順が自動化されました。
F5でデバッグ開始
→ソースの変更箇所があり、新たにDLLがビルドされた場合、DLLが適切なディレクトリにコピーされる
→親アプリが起動され、プロセスにアタッチする
→親アプリからDLLの機能が呼び出される
 
あとは、DLLのソースコードにブレークポイントを設定したり、ログを確認したりしてデバッグを行います。
 
ソースを修正したらF5を押すだけでデバッグが開始できるので、通常のアプリケーションと同じ感覚でデバッグができますね。
クラスライブラリ(DLL)プロジェクトのデバッグ方法のご紹介は以上です。

10件のコメント

  1. ピンバック:NiconamaCommentViewer(ニコ生コメントビューア)のプラグイン作成法 デバッグ編 | 夏研ブログ

  2. コピーの設定はできましたが、親アプリの登録ができません。
    2010EXPRESSだからでしょうか?。

  3. ロフトくん

    >ぶりさん
    こんにちは。
    EXPRESSはプロセスへのアタッチ機能の設定画面がないので、
    通常、親アプリの登録はできません。

    しかし以下の裏ワザで設定ファイルを手書きで作ることで、
    プロセスへのアタッチが可能です。
    以下記事の2013年1月9日 at 10:12 PM
    のコメントを追ってみてください。
    http://c-loft.com/blog/?p=1058#comment-8132

  4. プロジェクトのプロパティにビルドイベントやデバッグがなくて困っています。
    上で質問しているとおり、VS2010のときはあったと思うので、VS2013では、
    機能削除されてしまったのでしょうか?

    • ロフトくん

      >BURIさん
      ・”ビルドイベント”は、VS2013(Visual Studio Express 2013 for Windows Desktop)では、プロジェクトのプロパティにあるようです。
      従って、ブログ本文の”手順1 DLLを自動的にコピーする”は設定可能と思われるのでお試し下さい。

      ・”デバッグ”もプロジェクトのプロパティにありますが、”外部プログラムの開始”はないようです。
      しかしながらツールバーの”デバッグ”にプロセスにアタッチがあります。
      従って、ブログ本文の”手順2 親アプリを起動する”は手動で可能と思われますのでお試し下さい。
      また、前述のコメントで紹介している裏技が適用できればプロセスにアタッチの自動化も可能と思われますのでお試し下さい。

  5. 手順1でエラーが出て困っています。以前はできたはずなんですが。
    エラー 2 コマンド “copy C:\Users\BURI\documents\visual studio 2013\Projects\ClassLibrary1\bin\Release\ClassLibrary1.dll C:\”Program Files(x86)\NiconamaCommentViewer\Plugins\” はコード 1 で終了しました。 ClassLibrary1

    というわけでコード1で終了してしまいます。何が悪いんでしょうか?

    • ロフトくん

      >BURIさん
      こんにちは。
      以下のように記述してみて下さい。

      copy “C:\Users\BURI\documents\visual studio 2013\Projects\ClassLibrary1\bin\Release\ClassLibrary1.dll” “C:\Program Files(x86)\NiconamaCommentViewer\Plugins\”

      “”で囲むのがポイントです。
      (visualとstudioの間や、ProgramとFilesの間にスペースが有るため、””で囲む必要があります。)

  6. ReleaseとDebugの違いおよび構成マネージャーでプラットフォームを変更したときにx86となるところとかつまづきましたが、何とか解決しました。ありがとうございました。

  7. はじめまして。コメビュプラグインを作成しようとしたときにこのサイトを発見し、大変お世話になっております。

    本題ですが、この記事の手順を踏み親アプリを起動してデバックを行ったのですが、放送に接続した時にコメビュが強制終了してしまいます。どのようにすれば強制終了せずにすむのでしょうか。
    使用している開発ソフトはVS2010で、言語はC#です。

  8. ロフトくん

    >FurudoLakiさん
    はじめまして、こんにちは。
    放送に接続すると落ちてしまうということですので、
    以下等のメソッドの先頭にブレークポイントを張り、
    デバッグ開始して、そのブレークポイントで止まることを確認してみます。

    つぎに、1行ずつステップ実行してみてどこで落ちるかを確認してみます。

    ・Run
    ・BroadcastConnected
    ・ReceivedComment

    また、上記メソッド内部に例外処理(try-catchで囲む)を仕込んでおくことをお勧め致します。
    例外が発生し、catchの中に入っていたらその例外内容(コンソールログに
    出力させるのがお勧めです。)から調査を進めることができます。
    ご不明な点はお尋ね下さい。。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です