none
拡張プロバイダーで作ったプロパティが表示されないことがある RRS feed

  • 質問

  • Visual Studio 2010 で、Visual Basic を使用してWindows Forms アプリケーションを開発しています。

    拡張プロバイダーでプロパティを作ったのですが、フォーム デザイナーで表示されたりされなかったりします。

    以下の手順を踏めばプロパティの再表示はできますが、デザイナーで設定をやり直さなくてはならず、実用に耐えません。

    拡張プロバイダーのプロパティが消えないようにする方法は無いでしょうか?

    1)ソリューションのクリーンを実行する。

    2)Visual Studio をいったん終了し、隠しファイル *.suo(Solution User Options)を削除する。

    3)ソリューションを開き、拡張プロバイダーを実装したプロジェクトのみをリビルドする。

    4)実装したい画面をフォーム デザイナーで開く。

    実装したい画面は、2とは別のクラス ライブラリ プロジェクトに含まれています。ソリューションには50以上のプロジェクトが含まれています。

    2011年5月11日 9:26

すべての返信

  • 少し状況がわかりにくいのですが、

    • Solution1.sln に、Project1 ~ Project50 のような50個程度のプロジェクトがある
    • Project20 に拡張プロバイダが実装されている
    • Project30 のフォームデザイン時に拡張プロパティが表示されない

    という状況でしょうか? その状況で VBProject20 をリビルド等を行うとプロパティが参照できるようになるということですね? この場合、確認するのは、

    • Project30 の参照設定がどうなっているか
    • Project20 が同一ソリューション上の別のプロジェクトを DLL 指定で参照しているのではないか
    • 参照設定で参照している対象がビルド エラーを発生させていないか

    というあたりでしょうか。Visual Studio は Project20.dll (拡張プロバイダが実装されているもの)を実行時にロードできる必要があり、それができない場合には拡張プロパティが表示されません。

    前者を確認することで、Visual Studio がどこにある Project20.dll を探そうとしているのかがわかります。Project20 をリビルドすることでプロパティが表示されるということは、可能性の1つとして参照設定が DLL 指定になっており、Project20.dll が何らかの理由で削除された状態でフォーム デザイナを開いている可能性があります。たとえば、Project20 を参照している別のプロジェクト Project40 に対してクリーンを指定したりに、リビルドでエラーになって Project20.dll が削除されている状態になるなど、Project20.dll が削除される可能性はたくさんあります。DLL 参照ではなく、ソリューション内のプロジェクトを間接指定したプロジェクト参照であれば、Visual Studio がコンパイルされた Project20.dll を確保しておいてくれるので、そういった問題は発生しません。

    後者も類似の問題ですが、後者は Visual Studio が Project20.dll を発見することができるが、それをロードできないような状態になっていないかの確認です。たとえば、Project20 が別のクラスライブラリ Project10 を参照している場合、Project20.dll をロードして実行する場合に Project10.dll が必要になる可能性があります。このような場合に、Project10.dll について前述と同様に Visual Studio がロード可能な状態になっていなければなりません。

    当然ですが、上記の話はソリューション外にある参照アセンブリにも言えます。対称のプロジェクトをリビルドすると、ローカルコピーする設定になっている参照ファイルが出力先にコピーされますので、上記のような「うっかりファイルを消してしまった」場合に、消えたファイルが復活してうまくプロパティが表示されるようになるのではないかという可能性があります。

    2011年5月12日 11:45
  • ご回答、ありがとうございます。
    状況はまさにご指摘の通りです。

    • Solution1.sln に、Project1 ~ Project50 のような50個程度のプロジェクトがある
    • Project20 に拡張プロバイダが実装されている
    • Project30 のフォームデザイン時に拡張プロパティが表示されない
    ただ、拡張プロバイダーが実装されているのはProject1、一番最初にビルドされ、他のプロジェクトを参照していないプロジェクトです。
    他のプロジェクトはProject1をプロジェクト参照しているので、
    Project20 が同一ソリューション上の別のプロジェクトを DLL 指定で参照しているのではないか
    は当てはまりません。

    Project1 を実装中なので、一時的ににコンパイル エラーとなる状態で作業したり、クリーンしたりすることが多々あります。

    プロジェクト参照であれば、Visual Studio がコンパイルされた Project20.dll を確保しておいてくれるので、そういった問題は発生しません。
    ということですが、このキャッシュ機能がうまく働いていないということかも知れないですね。

    2011年5月13日 6:20