急!急!急!在线等。C# 调用Dll出现“ 该值类型必须与 Struct 成对出现”

kevinyu160315 2016-06-22 03:46:42
在调用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 成对出现)。
...全文
176 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

111,082

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧