C# アプリケーションから COM+ コンポーネントのコンストラクタ文字列をプログラムで設定しようとしています。次のサンプル コードをオンラインで見つけましたが、例外がスローされます。
COMAdminCatalogCollection Components;
COMAdminCatalogClass Catalog = new COMAdminCatalogClass();
string strConstr;
string ApplicationName = "ApplicationName"; // case sensitive
string CompName = "MyComponent.ProgID";
COMAdminCatalogCollectionClass Applications = (COMAdminCatalogCollectionClass)Catalog.GetCollection("Applications");
Applications.Populate();
// find the correct application
foreach (COMAdminCatalogObjectClass AppObject in Applications)
{
if (AppObject.Name == ApplicationName)
{
// find matching component
Components = (COMAdminCatalogCollectionClass)(Applications.GetCollection("Components", AppObject.Key));
Components.Populate();
foreach (COMAdminCatalogObjectClass CompObject in Components)
{
if (CompObject.Name.ToString() == CompName)
{
CompObject.get_Value("ConstructorString").ToString();
CompObject.get_Value("ConstructionEnabled").ToString();
}
}
}
}
このコードを実行すると、6 行目で次の例外が発生します。
タイプ 'System.__ComObject' の COM オブジェクトをクラス タイプ 'COMAdmin.COMAdminCatalogCollectionClass' にキャストできません。CLR に入り、IProvideClassInfo をサポートしないか、相互運用アセンブリが登録されていない COM コンポーネントは、__ComObject 型にラップされます。この型のインスタンスは、他のクラスにキャストできません。ただし、基になる COM コンポーネントがインターフェイスの IID に対する QueryInterface 呼び出しをサポートしている限り、インターフェイスにキャストできます。
どこが間違っているのか分かりますか?または、これを行う簡単な方法はありますか?