急!急!急!在线等。C# 调用Dll出现“ 该值类型必须与 Struct 成对出现”
在调用C++ dll时不太会调用,请各位帮助:
C++非自己开发,无代码。
结构体中string 均不知道长度是多少。
C++ 结构体原型;
typedef struct _tagLoginRequest
{
string strName; // 用户名
string strPwd; // 用户密码
string strGUID; // 用户的 GUID
unsigned int uID; // 用户的 ID
bool bIsNewID; // 是否是新用户
}LOGIN_REQUEST, *LOGIN_REQUEST_PTR;
回调函数原型:
typedef void(CALLBACK *FuncConnect)(bool bSuccessful, DWORD dwUser);
typedef void(CALLBACK *FuncConnectError)(int nErrorCode, DWORD dwUser);
函数原型:
BOOL __stdcall AEBELL_IPCAST_Connect(
string strIP,
UINT uPort,
LOGIN_REQUEST stuLoginRequest,
FuncConnect cbConnect,
FuncConnectError cbConnectError,
DWORD dwUser);
我自己C#的相关定义:
回调定义:
public delegate void FuncConnect( bool bSuccessful, uint dwUser);
public delegate void FuncConnectError( int nErrorCode, uint dwUser);
结构体定义:
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct _tagLoginRequest
{
public string strName;
public string strPwd;
public string strGUID ;
public uint uID; // 用户的 ID
public bool bIsNewID; // 是否是新用户
}
以上接口在dll相关工具中查看得知,入口只能定义为带参数形式。直接定义入口为原型名称是,提示找不到入口。
C#定义如下:
[DllImport(mAEIPBrdDllPath, EntryPoint = "?AEBELL_IPCAST_Connect@@YGHV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IU_tagLoginRequest@@P6GX_NK@ZK@Z", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
public static extern bool AEBELL_IPCAST_Connect(string sreIp, uint uPort, [In, MarshalAs(UnmanagedType.LPStruct)] _tagLoginRequest pLoginRequest, FuncConnect cbConnect, FuncConnectError cbConnectError, uint dwUser);
调用代码:
m_LoginRequest.uID = UID;
m_LoginRequest.bIsNewID = bIsNew;
m_LoginRequest.strUserName = "adsmin";// CodeBytes(UserName, 128);
m_LoginRequest.strPwd = "123";// CodeBytes(Password, 128);
m_LoginRequest.strGUID = "123-432-1231";// CodeBytes(userGUID, 128);
int nsize = Marshal.SizeOf(typeof(IPBrdDll._tagLoginRequest));
IPBrdDll.FuncConnect pfConn = new IPBrdDll.FuncConnect(IPBrdDll.cbFuncConnect);
IPBrdDll.FuncConnectError pfconnErr = new IPBrdDll.FuncConnectError(IPBrdDll.cbFuncConnectError);
uint dwUser = 0;
string sIp = "127.0.0.1";
uint nPort = 8000;
bool bResult = IPBrdDll.AEBELL_IPCAST_Connect(sIp, nPort,m_LoginRequest, pfConn, pfconnErr, dwUser);
运行后提示:
An unhandled exception of type 'System.Runtime.InteropServices.MarshalDirectiveException' occurred in SMISYSAE.dll
Additional information: 无法封送处理“parameter #3”: 无效的托管/非托管类型组合(该值类型必须与 Struct 成对出现)。