目录
C# 封装C/C++动态库,主要遇到三个问题:
1 怎样把参数里面的结构体定义出来
2 结构体指针传递参数
3 PtrToStructure出现 结构不得为值类的问题
1 C文件函数参数有结构体 并且含有指针
此时需要定义一个结构体,用到C++和C#的类型转换,其中比较难的是结构体。如下:
C++中:
ypedef struct XXX
{
uint8_t Message_Block[64];
}
对应C#中:
需要使用MarshalAs()
public struct XXX
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] Message_Block;
}
2 结构体指针传递参数
此时需要用到
Marshal.AllocHGlobal();
Marshal.StructureToPtr();
Marshal.PtrToStructure();
Marshal.FreeHGlobal();
public AES_ctx ctx;
//分配非托管内存 AES_ctx为结构体类型
IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(AES_ctx)));
//数据从托管封存到非托管中
Marshal.StructureToPtr(ctx, pt, true);
//数据从非托管到托管 即从指针到结构体
ctx = (AES_ctx)Marshal.PtrToStructure(pt, typeof(AES_ctx));
//释放内存
Marshal.FreeHGlobal(pt);
3 PtrToStructure报错 结构不得为值类的问题
不能使用
Marshal.PtrToStructure(pt, ctx);
这样报错结构卜德伟值类的错误
改为:
ctx = (AES_ctx)Marshal.PtrToStructure(pt, typeof(AES_ctx));