IDL で構造体を定義する従来の C++ COM DLL があります。
IDL の簡易版には次のものが含まれます。
typedef struct
{
int num;
} LegacyStruct;
interface ILegacyInterface : IUnknown
{
HRESULT GetStruct( [in,out] LegacyStruct* pVal );
}
ここで、ILegacyInterface を実装する .Net C# COM 可視アセンブリを定義する必要があります。
C# プロジェクトでは、レガシ COM DLL への参照を追加し、このインターフェイスを実装するクラスを定義します。
[ComVisible( true )]
public class CSClass : ILegacyInterface
{
public void GetStruct( ref LegacyStruct pVal )
{
....
}
}
目標は、この COM 公開 C# アセンブリ クラスを C++ COM クライアント プログラムで利用することです。このプログラムは、従来の COM DLL と、ILegacyInterface を実装する新しい C# アセンブリ クラスの両方を使用できる必要があります。
コンパイル時に、次の警告が表示されます:
Type library exporter warning processing 'CSClass.GetStruct(pVal)'. 警告: 非 COM 可視値型 'LegacyStruct' は、現在エクスポートされている型またはその基本型のいずれかから参照されています。
LegacyStruct が非 COM 可視であるため、結果のアセンブリの .tlb には GetStruct() メソッドが公開されていません (つまり、oleview を使用して表示した場合)。
明らかに、C++ COM クライアントはコンパイルされません:
エラー C2039: 'GetStruct' : is not a member of 'CSClass'
レガシ C++ COM DLL で定義されている LegacyStruct が、C# COM 可視 .Net アセンブリのメソッドで使用されたときに適切に公開されるようにする方法はありますか?