1

C# .NET アプリケーションで外部のネイティブ COM コンポーネントを使用しています。

この COM DLL にはタイプ ライブラリがないため、相互運用コードを自分で作成する必要があり、TlbImp のように include/idl ファイルを作成しました。しかし、最悪のことは、オブジェクトの作成が次のように失敗することです。

Creating an instance of the COM component with CLSID {40700425-0080-11D2-851F-00C04FC21759} from the IClassFactory failed due to the following error: 80040111

ネイティブを使用し、実装されたインターフェイス IID の 1 つをCoCreateInstance指定すると、最終的にクラスが作成されます。class_id

結局のところ、問題は COM オブジェクトがパラメーターとして渡されたIClassFactory::CreateInstanceものをサポートしていないため、返されることにあります(逆アセンブラーとデバッガーで特定しました)。コンポーネントは MS SQL VDI です。IID_IUnknownriidCLASS_E_CLASSNOTAVAILABLE

CreateInstance.NET RCW に別のインターフェイス ID をメソッドに渡すよう強制する方法はありIID_IUnknownますか? 私はネットをたくさん検索しましたが、これに対する解決策は見つかりませんでした。

回避策として、現在は C++/CLI を使用してオブジェクトを作成し、IID_IUnknownこの目的ではなく適切なインターフェイスを要求しています。しかし、C++/CLI ではプラットフォームごとに異なる DLL をビルドする必要があるため、C# でコードを作成したいと考えています。

ありがとう

4

1 に答える 1

2

私は再現します。ぶん、痛い。CoCreateInstance を pinvoke できます。

[return: MarshalAs(UnmanagedType.Interface)]
[DllImport("ole32.dll", ExactSpelling=true, PreserveSig=false)]
public static extern object CoCreateInstance(ref Guid clsid, 
    [MarshalAs(UnmanagedType.Interface)] object punkOuter, int context, ref Guid iid);
于 2011-09-18T19:38:35.050 に答える