你如何使用这里描述的技术 https://stackoverflow.com/questions/3235916/a-way-how-to-compile-c-library-into-net-dll/3236027#3236027使用 .Net 中的 C 结构?
当然,我需要一个代码示例 - 分为 3 个部分:C 声明部分、C++ 围绕 C 和 C# 访问。
所以我想知道的是
C 结构体 A 的参数之一是结构体 B,该结构体 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++ 异常。构建此版本目标。
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();
a.b.setBMember1(10);
a.b.setBMember2(20);
unsafe
{
a.b.setBMember3(&toBePointed);
}
a.ShowInfo();
Console.ReadKey();
}
正如你所看到的,原来的 StructA 在某种程度上被淘汰了!由于访问问题,我不知道有任何其他方法可以直接从 C# 访问 C 结构成员。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)