我们有很多用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