5

以下のように、C# で定義された 2 つのインターフェイスがあります。

[Guid("4938540B-3DB2-452c-A061-59EC499657E7")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IRADevice
{
   Void FA();
}

/// <summary>
/// IRADevice interface represents a given RADevice.
/// </summary>
[Guid("4938540B-3DB2-452c-A061-59EC499657E8")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IRADevice2 : IRADevice
{
    void FB();
}

C++ コードでは、次のコマンドを使用して、上記のインターフェイスによって生成された tlb をインポートします

#import "device.tlb"  raw_interfaces_only

作成された tlh ファイルは次のとおりです。

struct __declspec(uuid("4938540b-3db2-452c-a061-59ec499657e7"))
IRADevice : IDispatch
{
//
// Raw methods provided by interface
//

virtual HRESULT __stdcall FA ( ) = 0;
};

struct __declspec(uuid("4938540b-3db2-452c-a061-59ec499657e8"))
IRADevice2 : IDispatch
{
//
// Raw methods provided by interface
//

virtual HRESULT __stdcall FB ( ) = 0;
};

IRADevice は、IDispatch からではなく、IRADevice から派生し、FA 機能を含んでいると思います。誰かが私がどこで間違ったのか教えてもらえますか?

4

1 に答える 1

2

@HansPassant が述べたように、これは既知の制限です。少し時間がかかりましたが、その事実を裏付ける関連ドキュメントをいくつか見つけました。http://msdn.microsoft.com/en-us/library/aa645736(v=vs.71).aspx

最も関連性の高い部分は次のとおりです。

C# で宣言された COM インターフェイスには、IUnknown と IDispatch のメンバーを除いて、基本インターフェイスのすべてのメンバーの宣言が含まれている必要があります — .NET Framework はこれらを自動的に追加します。IDispatch から派生する COM インターフェイスは、InterfaceType 属性でマークする必要があります。

于 2013-01-24T20:31:45.360 に答える