-2

私はたくさんのネイティブ C++ オブジェクトを持っており、クラスには DTL マップ、マップのマップ、リスト、ベクトルが含まれています。

C++ ネイティブ コードからマネージ C++ 関数を呼び出す必要があり、これらのネイティブ オブジェクトと STL コンテナー (リスト、マップ、マップのマップ) を C++/CLI に渡す必要があります。これらのオブジェクトをマーシャリングするか、何らかの方法でシリアル化する必要があります。どうすれば問題なくそれを行うことができますか。そのため、マネージド C++/CLI にマーシャリングしてシリアライズした後、マップはディクショナリとディクショナリのディクショナリ、マネージド List<> を含む stl リストなどでマーシャリングする必要があります。

すべてのケースでこれを達成するにはどうすればよいですか? マーシャリングの問題の複雑な処理が必要ですか...?

よろしくウスマン

4

1 に答える 1

1

STLメモリレイアウトは実装固有です。たとえば、実装を使用する場合、sizeof(std :: vector)はリリースでは16、デバッグモードでは20であり、VisualC++に付属しています。また、STLクラスには、管理対象メモリに意味のある形でマーシャリングできないポインタがあります。.Netはこれらのタイプをよりよく理解しているため、マーシャリングを実行する場合は、インターフェイスでプラットフォームに依存しないCまたはCOMタイプに切り替えることができます(たとえば、countパラメーターを含む配列または安全な配列を渡す)。COMはより豊富なタイプを持ち、必要に応じて他の言語をサポートするため、COMをお勧めします。

または、速度が必要な場合は、変換を行うmarshal_asテンプレート関数を記述して、マーシャリングコードまたはマーシャリングバッファーを再利用したり、C++オブジェクトのマネージラッパーを記述したりできます

マーシャリングされるデータが大きすぎてメモリに収まらない場合は、データを一時ファイルまたはデータベースにシリアル化して、マネージコードからチャンクで読み戻すこともできます。

于 2010-10-25T22:33:07.697 に答える