2

免責事項: マーシャリングの概念がゼロに近い..

私は文字列 + 構造体 C の配列を含む構造体 B を持っています。これを巨大な相互運用キャズムを越えて COM - C++ コンシューマに送信する必要があります。
構造体定義を装飾するために必要な属性の正しいセットは何ですか?

[ComVisible (true)]
[StructLayout(LayoutKind.Sequential)]
public struct A
{
    public string strA
    public B b;
}


[ComVisible (true)]
[StructLayout(LayoutKind.Sequential)]
public struct B
{
    public int Count;

    [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct, SizeParamIndex=0)]
    public C [] c;
}

[ComVisible (true)]
[StructLayout(LayoutKind.Sequential)]
public struct C
{
    public string strVar;
}

編集:@Andrew基本的にこれは私の友人の問題です。彼はこれを .Net で動作させています。彼は、C++ 領域で使用できる .tlb/.tlh を作成するためにいくつかの自動魔法を実行します。問題は、配列のサイズを修正できないことです。

4

2 に答える 2

4

C++: .NET Framework プログラミング用の最も強力な言語

C++/C# の境界を越えて構造化データをマーシャリングする必要があるプロジェクトにアプローチしようとしていましたが、より良い方法を見つけました (特に C++ を知っていて、新しいプログラミング言語を学習するのが好きな場合)。Visual Studio 2005 以降にアクセスできる場合は、マーシャリングではなく C++/CLI の使用を検討してください。基本的に、C# と 100% 互換性のあるこの魔法のハイブリッド .NET/ネイティブ クラス ライブラリを作成できます (別の C# プロジェクトで使用する目的で、すべてを C# で記述したかのように)、C とも 100% 互換性があります。および/またはC++。あなたの場合、データをメモリ内の C++ からメモリ型の CLI にマーシャリングする C++/CLI ラッパーを作成できます。

純粋な C++ コードを使用してデータファイルを読み書きし (これはサード パーティのライブラリである可能性もあります)、C++/CLI コードは C++ データを次のように変換 (コピー) します。 C# で読み取り/書き込みライブラリを記述したかのように直接使用できるメモリ内の .NET 型。C++ への CLI 拡張を学ばなければならないので、私にとって唯一の障壁は構文でした。これを学んでいた頃に戻って、構文の質問をするために StackOverflow があればよかったのに!

シンタックスをざっと見ていく代わりに、想像できる中でおそらく最も強力なプログラミング言語を学ぶことができます。考えてみてください。C# と .NET ライブラリの優雅さと健全性、および C++ の低レベルでネイティブ ライブラリとの互換性です。すべてのプロジェクトを C++/CLI で作成する必要はありませんが、C++ データを C#/.NET プロジェクトに取り込むには最適です。それは「うまくいく」だけです。

チュートリアル:

于 2008-08-28T23:13:18.957 に答える
1

答えは、マーシャリングしようとしているネイティブ定義が何であるかによって異なります。誰かが本当に助けることができるように十分な情報を提供していません。

ネイティブ配列で文字列をマーシャリングするときにつまずく一般的なことは、ネイティブ配列が構造体とインラインで割り当てられた文字列に固定サイズのバッファーを使用することが多いことです。あなたの定義は、文字列を含むメモリの別のブロックへのポインタとして文字列をマーシャリングしています (これがデフォルトです)。

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = ##)] はあなたが探しているものかもしれません...

于 2008-08-28T12:52:00.480 に答える