1

C# 呼び出し元の構造にデータを入力する C++ COM サーバーがあります。

構造体は、次のように C++ IDL で定義されます。

interface Icontrol : IDispatch{
    [ 
    uuid(...), 
    version(1.0) ]
    typedef struct testStructure
    { 
        int x;
        int y;
        int z;
        ...
    } testStructure; 

    ...
    [id(9)] HRESULT getStruct([ref,in,out] testStructure * theData);
    ...

次に、C# コードで次のようにします。

EO_Lib.testStructure test = new EO_Lib.testStructure();
EO_Lib.getStruct(ref test);

C# にネイティブではないフィールドの C# 構造体で MarshallAs を使用するだけで、通常の .DLL で問題なく動作させることができます。しかし、それを COM .DLL で動作させることはできません。IDLについての知識が不足しているためだと思います。

私ができる必要があるのは、適切な MarshallAs() 情報で作成した新しい C# 型で getStruct() を呼び出すことです。どうすればいいですか?

Visual Studio 2010 MFC/ATL C++ と C# .NET 4 Framework を使用しています。

4

2 に答える 2

0

管理された側からこれに取り組もうとしているようです。あなたのアーキテクチャについて多くの詳細を知らない (あなたが書いた/コードを所有しているように、これはあなたの COM サーバーですか?) 特に C++ 側からアプローチするソリューションを提供するために、いくつかの仮定を行う必要があります。 MIDL (IDL) の側面。

あなたは IDL について言及しており、私が知る限り、少なくともタイプ ライブラリを生成する IDL にアクセスできます。そのため、CLR (マネージ) 側のことは少し忘れて、アンマネージ環境 (COM) ですべてが機能するようにします。

それが完了したら、管理対象クライアントに対して構造体をどのように表示するかを決定します。その情報を使用して、C++/MIDL プロジェクトで新しい型を定義します。IDL 用の ACF (Application Config File) ファイルがない場合は、1 つ作成します (名前はまったく同じで、拡張子が ".idl" ではなく ".acf" の IDL ファイルです)。ACF ファイル内COM 構造体を、定義したばかりの新しい「マネージド フレンドリー」構造体にマップする user_marshal 型を宣言します。

// ACF file

typedef [user_marshal(testStructure_ForDotNet)] testStructure;

// where testStructure is your "original" struct and "testStructure_ForDotNet" 
// is the one you just defined.

最後に、変換関数 (マーシャリング関数) を定義する必要があります。詳細については、次のリソースを参照してください。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa367296(v=vs.85).aspx

とにかく、それが役立つことを願っています(誰でも)。

于 2014-09-24T08:08:52.093 に答える
0

質問に対する実際の解決策ではありませんが、以下は私の質問の理由を取り除きます。

から: http://msdn.microsoft.com/en-us/library/75dwhxf7(v=vs.100).aspx

プラットフォーム呼び出しから返される構造体は、blittable 型である必要があります。プラットフォーム呼び出しは、戻り値の型として blittable でない構造をサポートしていません。

基本的に、あなたは私がやりたかったことをすることができません。

COM の側面を無視すると、ここでの BrokenGlass のソリューションは、1 つの構造を別の構造に変換するという質問に答えます。

于 2012-08-20T17:58:15.130 に答える