共有メモリ構造内にデータを保持するC/C++で書かれたレガシーコードが多数あります。 C/C++の実装では、多くの関数について、共有メモリアドレスへのポインタを取得し、その共有メモリに格納されている構造体の型へのポインタをキャストします。ポインタを使用してアクセスできるC#で管理されていないネストされた固定長構造体を作成する方法
私はC#と同じインターフェイスを「移植」する必要があります。要件は、C/C++の実装を変更することはできず、インターフェイスはほぼリアルタイムでデータにアクセスするために使用されるため、パフォーマンスが問題になります。多くのデータ構造には、他のユーザー定義構造のネスト構造が含まれています。データにアクセスする主な方法は、構造体へのポイントを取得し、目的の要素に直接アクセスすることです。
私の問題は、完全に管理されておらず、C#でポインタで使用できる同等のデータ構造をC#で作成する方法です。 C#では、fixed属性を使用してネストされた構造体を作成できますが、その属性はプリミティブ型のみをサポートしているため、fixedキーワードをユーザー定義型で使用することはできません。 Web上のほとんどの例では、データ要素にアクセスするためにマーシャリングが使用されていますが、これらの例の宣言スタイルではデータ構造が管理され、ポインタとして使用できなくなります。
以下は、C#に移植する必要があるC/C++実装の簡単な例です。
これをC#の実装に変換して、ポインタで安全でないものとしてアクセスできる純粋に管理されていないデータ構造を作成する方法はありますか?
// Structures.cpp : Defines the entry point for the console application.
//
'#include "StdAfx.h"
typedef struct inner_struct
{
int a;
float b;
char text[16];
} InnerStruct;
'#define NUMELEMENTS 20
typedef struct outer_struct
{
int flag;
int num;
InnerStruct data[NUMELEMENTS];
} OuterStruct;
void *fSharedMemory();
int _tmain(int argc, _TCHAR* argv[])
{
int a;
OuterStruct *data = NULL;
data = (OuterStruct *)fSharedMemory();
while (true)
{
if (data->flag)
for (int i=0; i<data->num; i++) {
a = data->data[i].a;
}
Sleep(100);
}
return 0;
}
私はここで何かを逃しているように感じます。十分な時間とお金があれば、すべての実装をマネージコードとして書き直すことになるだろうが、私はレガシーコードとインターフェースを取る唯一の人ではないと信じなければならない。
残念ながら、私がWeb上で見つけたすべての例(これはインクルードされています)は、結果がC#でポインタで使用するのに適したアンマネージド型である方法で、 。 – user517041
Cでvoid *に相当し、返されるvoid *ポインタに相当するアンマネージコードから返されるものは、ネストされたユーザ定義構造体へのポイントとしてキャストされ、次に返されたポインタを使用してアクセスされる必要がありますアンマネージコード – user517041