2010-11-23 28 views
0

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

我觉得我在这里错过了一些东西。如果有足够的时间和金钱,我们会将所有的实现改写为托管代码,但是我必须相信我不是唯一一个必须与遗留代码进行交互的人。

回答

0

可以使用的PInvoke /编组站到你所需要的

http://msdn.microsoft.com/en-us/library/aa288468%28VS.71%29.aspx

有在该网站上的例子,它会让你在DLL中的集成和C/C++结构为C#。

+0

不幸的是,我在网上找到的所有例子(包括这个例子)都没有显示如何处理嵌套的用户定义结构,结果是一种非托管类型,适合与C#中的指针一起使用。 – user517041 2010-11-29 00:39:52

相关问题