你如何使用技术(描述)来处理.Net的C结构和指针?

你如何使用这里描述的技术来处理.Net的C结构?

当然,我需要一个代码示例 – 分3部分:C声明部分,C ++包装C和C#acsessing。

所以我想知道的是

C结构体A具有其参数结构B之一,其由至少2种类型组成,其中一种是指向应声明的某些变量C的指针。

我们想要从C#.Net访问所有A和B结构及其参数和变量C.

怎么办这样的事?

假设这些是名为structs.h的文件中的C结构

struct StructB { int bMember1; int bMember2; int* bMember3; }; struct StructA { struct StructB aMember1; }; 

在新的VC ++ DLL项目中,启用公共语言运行时支持(旧语法)并确保禁用C ++exception。 为发布目标构建此项。

 extern "C" { #include "structs.h" } namespace Wrapper { public __gc class NewStructB { private: StructB b; public: NewStructB() { } ~NewStructB() { } int getBMember1() { return b.bMember1; } void setBMember1(int value) { b.bMember1 = value; } int getBMember2() { return b.bMember2; } void setBMember2(int value) { b.bMember2 = value; } int* getBMember3() { return b.bMember3; } void setBMember3(int* value) { b.bMember3 = value; } }; public __gc class NewStructA { public: NewStructB* b; NewStructA() { b = new NewStructB(); } ~NewStructA() { delete b; } void ShowInfo() { System::Console::WriteLine(b->getBMember1().ToString()); System::Console::WriteLine(b->getBMember2().ToString()); System::Console::WriteLine((*b->getBMember3()).ToString()); } }; }; 

然后创建一个新的C#控制台应用程序并引用我们刚刚构建的.dll文件。 在项目属性>构建中,选中“允许不安全的代码”。

 static void Main(string[] args) { int toBePointed = 12345; Wrapper.NewStructA a = new Wrapper.NewStructA(); absetBMember1(10); absetBMember2(20); unsafe { absetBMember3(&toBePointed); } a.ShowInfo(); Console.ReadKey(); } 

正如您所看到的,原始的StructA在某种程度上被淘汰了!! 而且我不知道由于访问问题而直接从C#访问C结构成员的任何其他方法。