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