2010-11-23 58 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

相關問題