C#-如何在包含数组的结构中封送非托管结构
我的任务是用非托管代码将C#程序连接到.DLL。我在互联网上找不到任何东西来帮助我实现这一目标。我收到一个Pinvokestack异常。我尝试将呼叫约定更改为.Winapi,但运气不佳。我可能是完全错误的,所以任何关于如何处理这一问题的指导都是值得赞赏的 以下是我必须处理的非托管代码:C#-如何在包含数组的结构中封送非托管结构,c#,struct,dllimport,unmanaged,dllexport,C#,Struct,Dllimport,Unmanaged,Dllexport,我的任务是用非托管代码将C#程序连接到.DLL。我在互联网上找不到任何东西来帮助我实现这一目标。我收到一个Pinvokestack异常。我尝试将呼叫约定更改为.Winapi,但运气不佳。我可能是完全错误的,所以任何关于如何处理这一问题的指导都是值得赞赏的 以下是我必须处理的非托管代码: extern "C" __declspec(dllexport) int WINAPI GetAlarm (unsigned short hndl, ALARMALL *alarm); typedef stru
extern "C" __declspec(dllexport) int WINAPI GetAlarm (unsigned short hndl, ALARMALL *alarm);
typedef struct {
ALARM alarm [ALMMAX];
} ALARMALL;
ALMMAX = 24
typedef struct {
short eno;
unsigned char sts;
char msg[32];
} ZALARM;
下面是我写的托管C#side:
[DllImport("my.dll", EntryPoint = "GetAlarm", CallingConvention = CallingConvention.Cdecl)]
public static extern int GetAlarm(ushort hndl, ALARMALL alarm);
public struct ALARMALL
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
ZALARM alarm;
}
[StructLayout(LayoutKind.Sequential)]
public struct ZALARM
{
[MarshalAs(UnmanagedType.I2)]
public short eno;
[MarshalAs(UnmanagedType.U1)]
public byte sts;
[MarshalAs(UnmanagedType.I1, SizeConst = 32)]
public char msg;
}
终于让它正常工作了,所以我将为任何可能发现它有用的人发帖
[DllImport("my.dll", EntryPoint = "GetAlarm")]
public static extern int GetAlarm(ushort hndl, ref ALARMALL alarm);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct ALARMALL
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
public ZALARM[] alarm;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct ZALARM
{
public short eno;
public byte sts;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string msg;
这不是cdecl。你为什么要那样做?WINAPI扩展到stdcall。函数接受指向struct的指针。你按价值传递它。根据语义,通过ref或out传递它。你也不会很幸运地从味精中读到任何东西。