none
アドイン内のユーザ定義型の判定について RRS feed

  • 質問

  • 環境:Windows XP SP3
    .NET 3.5 SP1
    VS2005Pro
    言語:C#またはVB

    状況:
    Visual Studioアドインプロジェクト(MyAddin1.dll)と、
    Windows Form カスタムコントロールプロジェクト(ClassLibrary1.dll)を作成しています。

    カスタムコントロールは、WinFormのForm、Button、TextBoxなどを継承して機能(主にプロパティ)を追加したものです。

    アドインプロジェクトは、このClassLibrary1.dllを参照しています。
    アドインでは、((IServiceProvider)DTE2.ActiveDocument.ActiveWindow.Object)から、
    IDesignerHost.Container.Componentsを通してIComponentを列挙して、上記で作成したカスタムコントロールだけを対象に、プロパティに値を設定したいと思っています。
    つまり現在開いているデザイナ画面上のカスタムコントロールに対して、一律に値を設定しようとしています。

    問題点:
    この状況で列挙したIComponentは問題なく画面上のコントロールを取得できていますが、
    型の判定が正しく動作しません。

    foreach(IComponent comp in designer.Container.Components){
      if(comp is ClassLibrary1.CustomButton){
        MessageBox.Show("カスタムボタンです!!!");
      }else{
        MessageBox.Show("カスタムボタンではありません");
    }


    ※designer は IDesignerHost

    と実装しても、カスタムボタンと認識されません。
    しかし、「if(comp is System.Windows.Forms.Button)」とすると、Button派生クラスである事が正しく判定できます。
    そこで、ClassLibrary1.dllを署名してassemblyフォルダに登録したところ、期待した動作をするようになりました。
    (なお、ClassLibrary1.dllをdevenv.exeと同じフォルダに格納しても、MyAddin1.dllと同じフォルダに格納しても、署名の有無にかかわらず型判定は正しくできませんでした)

    ここで質問なのですが、アドインを実行する時、型の判定をするためには、アドインが参照している
    アセンブリはassemblyフォルダに無いと動作しないという仕様なのでしょうか?
    そうでない場合は、どこか適切なフォルダに格納すると正しく動作するのでしょうか?

    また、この事象は Visual Studio 2010 でも発生するのでしょうか?

    MSDNサイトなどを見たりフォーラムの過去の記事を検索したりしたのですが、どうしても役に立つ資料を見つけられませんでした。
    どうかお力をお貸しいただけますよう、お願いいたします。
    説明不足な点があれば、追記させていただきます。

    2010年6月29日 7:03

回答

  • 自己レスです。解決しました。

    改めてサンプルを作ると正しく動作しました。

    アドインが違うアセンブリを参照してしまっていたのかも知れません。

    初めてアドインを作るので、混乱してしまっていたと思います。

    • 回答としてマーク vessa 2010年6月30日 8:15
    2010年6月30日 8:15