C#调用设置dll回调函数出错。
c++原型
typedef struct{
char m_cIP[16];m_cIP
char m_cMAC[18];m_cMAC
char m_cMask[16];m_cMask
char m_Gateway[16];m_Gateway
char m_cDNS[16];m_cDNS
int m_iChanNum;m_iChanNum
int m_iServerPort;m_iServerPort
int m_iClientPort;m_iClientPort
int m_iDeviceType;m_iDeviceType
int m_iHttpPort;m_iHttpPort
int m_iProductModel;m_iProductModel
char m_cFactoryID[64];m_cFactoryID
char m_cKernelVersion[64];m_cKernelVersion
char m_cOCXVersion[64];m_cOCXVersion
}TDEVICE, *PTDEVICE;
设置回调函数
int __stdcall NetAdmin_SetNotify(
FIND_NOTIFY _Notify_Notify
回调函数
);
typedef void (
PTDEVICE _pDevice_pDevice
[OUT]指向设备信息
);
改写后
[StructLayout(LayoutKind.Sequential)]
struct TDEVICE
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public Char[] m_cIP;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)]
public Char[] m_cMAC;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public Char[] m_cMask;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public Char[] m_cGateway;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public Char[] m_cDNS;
public UInt32 m_iChanNum;
public UInt32 m_iServerPort;
public UInt32 m_iClientPort;
public UInt32 m_iDeviceType;
public UInt32 m_iHttpPort;
public UInt32 m_iProductModel;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public Char[] m_cFactoryID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public Char[] m_cKernelVersion;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public Char[] m_cOCXVersion;
};
delegate void NotifyCallBack([MarshalAs(UnmanagedType.LPStruct)]IntPtr _Device);
[DllImport("NetAdmin.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int NetAdmin_SetNotify(NotifyCallBack callback);
执行后出错提示
无法封送处理“parameter #1”: 无效的托管/非托管类型组合(Int/UInt 必须与 SysInt 或 SysUInt 成对出现)。
------解决方案--------------------C++的int对应的不是C#的int吗
------解决方案--------------------
里面所有的 Char[] 改成 byte[] ,
delegate void NotifyCallBack([MarshalAs(UnmanagedType.LPStruct)]IntPtr _Device);
改成
delegate void NotifyCallBack(out TDEVICE _Device);
这样试下