一、函数引入
一般采用DllImport方法从Dll中导入函数。c\c++函数默认采用CallingConvention.Cdecl的入参方式。
声明函数参数时,对于 char *类型的字符串参数,c#中一般声明为
[MarshalAs(UnmanagedType.LPStr)] string a,
https://stackoverflow.com/questions/39987435/pass-char-to-c-dll-from-c-sharp-string
对于c中需要传入结构体指针的,可以使用ref struct的方式声明
https://stackoverflow.com/questions/28764634/how-to-pass-a-struct-pointer-from-from-c-sharp-to-win32-dll
https://stackoverflow.com/questions/31702766/how-to-properly-pass-struct-pointer-from-c-sharp-to-c-dll
二、结构体声明
声明方式
[StructLayout(LayoutKind.Sequential)]
public struct xxx{
}
https://stackoverflow.com/questions/9517668/sending-pointer-to-c-sharp-struct-into-c-dll
如果需要访问结构体中的成员,c#成员声明中还需要加入public属性
c中int类型,对应c# int类型
指针类型,对应c# intptr
数组类型,使用MarshalAs进行类型转换
MSDN的说明更加详细
https://docs.microsoft.com/en-us/dotnet/framework/interop/marshalling-classes-structures-and-unions
网友评论