gpt4 book ai didi

c# - 您如何使用技术(已描述)处理 .Net 中的 C 结构和指针?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:22 26 4
gpt4 key购买 nike

您如何使用 technique described here使用 .Net 中的 C 结构?

当然,我需要一个代码示例 - 分为 3 个部分:C 声明部分、C++ 环绕 C 和 C# 访问。

所以我想知道的是

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 项目中,启用公共(public)语言运行时支持(旧语法)并确保禁用 C++ 异常。为发布目标构建它。

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 文件。在 Project Properties > Build 中,选中“Allow unsafe code”。

static void Main(string[] args)
{
int toBePointed = 12345;

Wrapper.NewStructA a = new Wrapper.NewStructA();

a.b.setBMember1(10);
a.b.setBMember2(20);

unsafe
{
a.b.setBMember3(&toBePointed);
}

a.ShowInfo();

Console.ReadKey();
}

如您所见,原来的 StructA 在某种程度上被淘汰了!!由于访问问题,我不知道有任何其他方法可以直接从 C# 访问 C 结构成员。

关于c# - 您如何使用技术(已描述)处理 .Net 中的 C 结构和指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3239090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com