我們有很多用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;
}
我覺得我在這裏錯過了一些東西。如果有足夠的時間和金錢,我們會將所有的實現改寫爲託管代碼,但是我必須相信我不是唯一一個必須與遺留代碼進行交互的人。
不幸的是,我在網上找到的所有例子(包括這個例子)都沒有顯示如何處理嵌套的用戶定義結構,結果是一種非託管類型,適合與C#中的指針一起使用。 – user517041 2010-11-29 00:39:52