1

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 アセンブリのメソッドで使用されたときに適切に公開されるようにする方法はありますか?

4

2 に答える 2

3

この問題を解決するには、次の 2 つのアイテムが必要です。

  1. 従来の COM IDL には、定義されている構造の uuid が含まれている必要があります。これは上記の tcarvin によって言及されました。uuid に加えて、構造タグ名は構造名と同一でなければなりません。タグを除外するだけでは十分ではありません。つまり、uuid が存在する場合でもです。新しい構造定義は次のとおりです。

    typedef [uuid(XXX-YYY-ZZZ-AAA-BBB)]
    構造体 LegacyStruct
    {
    int num;
    LegacyStruct; }

    uuid が構造体に関連付けられていない場合、結果の .Net アセンブリに自動生成された uuid を持つその定義のコピーが含まれます。COM が同じ名前を持つ限り、これは明らかにまったく異なる構造になります。

  2. 従来の COM DLL が C# プロジェクトへの参照として追加された場合、"Embed Interop Types" プロパティを False に設定することが重要です。これにより、レガシー COM DLL の定義 (構造体など) が結果の .Net アセンブリに含まれないことも保証されます。

于 2012-06-29T14:38:25.217 に答える
1

これは、なぜこれが起こっているのかというあなたの質問に厳密には答えていないことを理解していますが、tlbimpで同様の問題に遭遇し、それを回避することを学びました.

一般に、.Net プロジェクトが TLB を自動的にインポートする方法は制限が厳しすぎることがわかりました。これを回避する方法は、適切な ComInterface、Guid、および CoClass 属性をすべて使用して、C# ファイルで IDL コンテンツを再宣言することです。

tlbimp+reflector も、これらの宣言のスケルトンを生成する良い方法です。tlbimp の逆コンパイル結果を見ると、欠落している .Net 宣言にあると予想される属性を確認でき、何が起こっているのかを理解するのに役立ちます。

于 2012-06-28T16:09:06.973 に答える