1

ネイティブ 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;
};
4

1 に答える 1