StructLayout的约定最好声明完整 例如 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]在结构体中嵌套结构体,没有特殊的写法 直接写就可以 public struct SServer { public SAdvance m_advanceCfg; }char[] 也可以用string来对应 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 19)] public string mStrTemp;
把char改为byte就对了。其它的看似正常
[StructLayout(LayoutKind.Sequential)] public struct OBE{ [MarshalAs(UnmanagedType.ByValTStr,SizeConst=19)] public string a; public byte b; public UInt16 c; }
//外层结构体 [StructLayout(LayoutKind.Sequential)] public struct CARD{ public UInt32 d; public OBE ObeInfo; }
函数调用时实例化外层结构体CARD时需要先实例化内层结构体OBE么? CARD Card = new CARD; Card.d = 123;OBE Obe = new OBE(); Obe.a = "aaa"; Obe.b = 123; Obe.c = 456;函数调用: FunctionA(ref Card);这样写是否有问题?
[StructLayout(LayoutKind.Sequential, CharSet= CharSet.Ansi)] public struct OBE{ [MarshalAs(UnmanagedType.ByValTStr,SizeConst=19)] public string a; public sbyte b; public UInt16 c; }
//外层结构体 [StructLayout(LayoutKind.Sequential)] public struct CARD{ public UInt32 d; public OBE ObeInfo; }
例如 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]在结构体中嵌套结构体,没有特殊的写法
直接写就可以
public struct SServer
{
public SAdvance m_advanceCfg;
}char[] 也可以用string来对应 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 19)]
public string mStrTemp;
public struct OBE{
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=19)]
public string a;
public byte b;
public UInt16 c;
}
//外层结构体
[StructLayout(LayoutKind.Sequential)]
public struct CARD{
public UInt32 d;
public OBE ObeInfo;
}
继续求答案。
CARD Card = new CARD;
Card.d = 123;OBE Obe = new OBE();
Obe.a = "aaa";
Obe.b = 123;
Obe.c = 456;函数调用:
FunctionA(ref Card);这样写是否有问题?
public struct OBE{
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=19)]
public string a;
public sbyte b;
public UInt16 c;
}
//外层结构体
[StructLayout(LayoutKind.Sequential)]
public struct CARD{
public UInt32 d;
public OBE ObeInfo;
}
下面的几个函数你可能需要:
Marshal.AllocHGlobal
Marshal.PtrToStructure
Marshal.StructureToPtr
Marshal.FreeHGlobal
参考: C#调用C++的DLL 所有数据类型转换方式
Marshalling Complicated Structures using PInvoke
我参考你给的第二条链接里面第一句话是
我理解是内层结构体的指针在外层结构体里面,而不是结构体本身。
我这个DLL定义里被嵌套的结构体用的不是指针吧?所以我不确定应不应该使用你提供的四个方法。
否则返回的数据写的非法地址去了
代码似乎少了一句
Card.ObeInfo = new OBE();
谢谢各位的热心,一百分平均分给回答的各位。