ネイティブ C++ プラグイン標準用のマネージ相互運用ライブラリを作成しようとしています。このネイティブ C++ ライブラリは、COM 互換のインターフェイス設計を使用しています。ただし、クラスの登録は行いません。COM と同様に、すべてのインターフェイスは IUnknown から派生します (FUnknown と呼ばれますが、3 つのメソッドは同じです)。
マネージド テスト プラグインをロードし、エクスポートされたメソッドを介して初期 (ルート) インターフェイス (オブジェクト ファクトリ パターン - com によく似ています) を取得する単純な C++ コンソール アプリを作成しました。私はサード パーティの DllExport コード属性の実装を使用していますが、これは正常に機能しているようです。C++ テスト アプリは LoadLibrary/GetProcAddress を使用し、インターフェイスへの参照を正常に取得します。マネージ エクスポート関数にブレークポイントを設定すると、期待どおりにヒットします。
次に、C++ テスト アプリは IUnknown (の一部) インターフェイスで AddRef を呼び出し、予想どおり 2 を返します。私のマネージ インターフェイス定義 (対応する部分) は IUnknown から派生していないことに注意してください。つまり、これらのメソッドが含まれています。これは、マネージ マーシャリング マジックが介入し、CCW を提供したことを意味します。
次に、C++ テスト アプリは、ファクトリ インターフェイスで単純なメソッド (int32 を返すだけのメソッド) を呼び出し、マネージド実装にも到着します (ブレークポイントがヒットします)。管理されていない移行。
class IPluginFactory : public FUnknown
{
public:
// removed other methods before and after this one
virtual int32 PLUGIN_API countClasses () = 0;
};
int32 は #define であり、PLUGIN_API は __stdcall として定義されます。これは、私が知る限り、COM 互換です。
私が定義したそのインターフェースのマネージ表現は次のとおりです。
[ComImport]
[Guid("same guid as in C++ file")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPluginFactory
{
[return: MarshalAs(UnmanagedType.I4)]
Int32 CountClasses();
}
このメソッドのマネージ実装は、ハードコードされた数値 (1) を返すだけです。
私は多くのことを試しましたが(すべてを思い出すことさえできません)、現在、これを解決する方法、または問題が何であるかについて途方に暮れています。
どんな助けでも大歓迎です。ありがとう!
編集: FUnknown に関する詳細のリクエスト:
class FUnknown
{
public:
virtual tresult PLUGIN_API queryInterface (const TUID iid, void** obj) = 0;
virtual uint32 PLUGIN_API addRef () = 0;
virtual uint32 PLUGIN_API release () = 0;
};