none
Visual Studio Packageを作成するときに他のクラスライブラリを使用できない! RRS feed

  • 質問

  • 従来「Add-in」という形式で提供されていたViusla Studioメニューから起動して、コードモデル解析用ライブラリ(EnvDTE/EnvDTE80等)を使用した、コード作成補完機能を作ろうと思っています。

    元々Visual Studioのマクロを組んで実行していた処理なのですが、マクロが廃止になり、スペルニットでやるには少々複雑な処理なのでVisual Studioのアドインとして実行しようとしたのですが、何とVisual Studio2013ではアドインも廃止になり、Packageで統合されるようになりました。

    作り方としてはVisual Studioのファイル→新規作成→プロジェクトより「拡張機能」セクションの「Visual Studio Package」を選択してウィザードに従うだけです。話を単純にするためにオプションで表示される単体テストや結合テストは作成しないことにします。

    とりあえずこの状態で出来上がったプロジェクトをデバッグすると、Visual Studioがもう一つ起動して「ツールメニュー」の下に、ウィザードの過程で指定したメニューが表示され、クリックすると確認用ダイアログが表示されます。これで開発準備OKです。

    ★今回の質問★
    --------------------------------

    ここでこのVisual Studio Package用のプロジェクトで、既存のクラスライブラリを使用するため「参照の追加」で適当なクラスライブラリを指定します。直ぐにソリューションエクスプローラに指定したクラスライブラリ名が表示されます。

    ここでパッケージ本体である〇〇〇〇Package.csというソースファイルの先頭で、この新規に参照を追加したクラスライブラリの名前空間をusing指定します。クラスライブラリ名前空間の先頭スペルを打つとちゃんとIntelliSenceが働いてドロップダウンに名前空間が出てきて選択できます。

    すなわちこの時点ではちゃんとこのPackageプロジェクトでは追加したクラスライブラリが正しく認識されていると思うのですが。。。

    ここでビルドを実行すると、コンパイラーがusing節で指定したそのクラスライブラリの名前空間が見つからない!メッセージを発してエラーになります。

    こんなはずはないと思い、ごく単純な文字列処理(「あ」を入れると「ああ」を返すような)メソッドを1つだけのクラス1個だけもつクラスライブラリを試しに作って上の操作をやっても同様にビルド時に「名前空間が見つからない」エラーになります。

    これはパッケージ作成プロジェクトでは他のクラスライブラリの参照は出来ない!ということを意味するのですが、パッケージとはそういう仕様なのでしょうか?それとも単純にVisual Studioのバグ?

    何方かこの方面の知識のある方、アドバイスもしくはヒント、あるいは参考とすべき情報の所在など、ご教授いただきたくお願い申し上げます。



    2014年6月6日 13:32

回答

  • Win8.1+VS2012+SDKとWin8.1+VS2013+SDKとWin7+VS2013+SDKで試してみました。
    質問だとクラスライブラリの参照手段がなにか書かれてないので、Packageプロジェクトを含むソリューションに新規にクラスライブラリプロジェクトを作ってプロジェクト参照でも、別に作っておいたdllを直接参照の2種類を試してみましたがどちらも問題なくコンパイルできました。

    どうにか再現できないか試して見たのですが、何も余計な設定をいじらずに(クラスライブラリに署名の追加かPackageの署名の解除を除く)同じ現象は再現できませんでした。
    packageプロジェクトに参照を追加て、ソリューションエクスプローラーでの参照のを選んで表示されるプロパティにあるReference Output Assemblyをfalseに変更すれば「error CS0246: 型または名前空間名 'ClassLibrary1' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています」とはなるんですが…

    プロジェクト参照で発生しているなら他の可能性としては、普通ではありえないですが、クラスライブラリのビルドより先にPackageプロジェクトがビルドされてるとかですかね。
    ビルド時のメッセージを見て先にクラスライブラリがビルドされているか確認するとか、ソリューションエクスプローラーからソリューションを右クリックしてプロジェクトのビルド順序を確認してみるとか。

    あとは、参照をいじくり回していると、参照しているクラスライブラリとビルド時に参照しているdllファイルがおかしくなっていることが稀にあるので、クラスライブラリのbinやdebug/releaseフォルダを完全に削除してリビルドしてみるとかですかね。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2014年6月9日 2:20
    • 回答としてマーク TrailRunner-MF 2014年6月10日 17:37
    2014年6月8日 13:11
  • gekkaさん、こんにちは、TrailRunner-MFです。お世話になっています。

    お返事遅れてしまって申し訳ありません。アドバイスに従い、原則としてPackage Projectが他のクラスライブラリを使用できないはずはないということなので、環境設定上の問題かと思い、幾つか試行したところ解決しました。

    ポイントは以下の2つです。

    1.Wizardに従って作成されたPackageプロジェクトの対応.NET Frameworkのバージョンが4.5になっていました。
    これに対して、Packageプロジェクトからインクルードさせようとしたクラスライブラリは既定で.NET Frameworkのバージョンが4.51でした。この両者の.NETバージョンを揃えれば(4.5でも、4.51でもOK)、ビルドは通るようになります。

    2. しかしこれではまだ十分ではありません。この状態でクラスライブラリ内のクラスを使用するコードを実装していると、ビルド後にDebugまたはDebug無しで開始しようとするときに「クラスライブラリ側に厳密名が必要」とのワーニングが発せられます。

    そこで、クラスライブラリのプロパティーページの「署名」タブより「アセンブリに署名する」チェックボックスをオンにしてキーファイルを作成すれば、これでちゃんとこのクラスライブラリを読み込んで内部の処理が自由に利用できるようになります。

    --------------------------------
    以上、gekka様のアドバイスに勇気をもらい、先に進むことが出来ました。心よりお礼申し上げます。
    2014年6月10日 17:38

すべての返信

  • Win8.1+VS2012+SDKとWin8.1+VS2013+SDKとWin7+VS2013+SDKで試してみました。
    質問だとクラスライブラリの参照手段がなにか書かれてないので、Packageプロジェクトを含むソリューションに新規にクラスライブラリプロジェクトを作ってプロジェクト参照でも、別に作っておいたdllを直接参照の2種類を試してみましたがどちらも問題なくコンパイルできました。

    どうにか再現できないか試して見たのですが、何も余計な設定をいじらずに(クラスライブラリに署名の追加かPackageの署名の解除を除く)同じ現象は再現できませんでした。
    packageプロジェクトに参照を追加て、ソリューションエクスプローラーでの参照のを選んで表示されるプロパティにあるReference Output Assemblyをfalseに変更すれば「error CS0246: 型または名前空間名 'ClassLibrary1' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています」とはなるんですが…

    プロジェクト参照で発生しているなら他の可能性としては、普通ではありえないですが、クラスライブラリのビルドより先にPackageプロジェクトがビルドされてるとかですかね。
    ビルド時のメッセージを見て先にクラスライブラリがビルドされているか確認するとか、ソリューションエクスプローラーからソリューションを右クリックしてプロジェクトのビルド順序を確認してみるとか。

    あとは、参照をいじくり回していると、参照しているクラスライブラリとビルド時に参照しているdllファイルがおかしくなっていることが稀にあるので、クラスライブラリのbinやdebug/releaseフォルダを完全に削除してリビルドしてみるとかですかね。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2014年6月9日 2:20
    • 回答としてマーク TrailRunner-MF 2014年6月10日 17:37
    2014年6月8日 13:11
  • gekkaさん、こんにちは、TrailRunner-MFです。お世話になっています。

    お返事遅れてしまって申し訳ありません。アドバイスに従い、原則としてPackage Projectが他のクラスライブラリを使用できないはずはないということなので、環境設定上の問題かと思い、幾つか試行したところ解決しました。

    ポイントは以下の2つです。

    1.Wizardに従って作成されたPackageプロジェクトの対応.NET Frameworkのバージョンが4.5になっていました。
    これに対して、Packageプロジェクトからインクルードさせようとしたクラスライブラリは既定で.NET Frameworkのバージョンが4.51でした。この両者の.NETバージョンを揃えれば(4.5でも、4.51でもOK)、ビルドは通るようになります。

    2. しかしこれではまだ十分ではありません。この状態でクラスライブラリ内のクラスを使用するコードを実装していると、ビルド後にDebugまたはDebug無しで開始しようとするときに「クラスライブラリ側に厳密名が必要」とのワーニングが発せられます。

    そこで、クラスライブラリのプロパティーページの「署名」タブより「アセンブリに署名する」チェックボックスをオンにしてキーファイルを作成すれば、これでちゃんとこのクラスライブラリを読み込んで内部の処理が自由に利用できるようになります。

    --------------------------------
    以上、gekka様のアドバイスに勇気をもらい、先に進むことが出来ました。心よりお礼申し上げます。
    2014年6月10日 17:38