我有一个C#应用程序(托管),通过一个包装的(托管)DLL调用静态库(C ++ - 非托管)。在从C ++代码回调到C#程序之前,所有代码都可以正常运行。执行中没有错误,其中回调调用中的字符串(C#)与C ++端回调时的字符串不相似。
我完全清楚“字符串”类型从托管到非托管和反向的解释不同。代码已经在托管DLL级别用于处理将字符串传递到C ++端,但是在从非托管代码的C#回调中传递字符串时遇到问题。我已经尝试过多种方法来“编组”参数,如下所示,但没有成功。 C#端参数的字符串结果将是从中文字符到“@VB |°¥¥¥¥.....”的任何内容。我甚至试着查看内存,看看是否有些东西搞砸了。 C ++部分下面的最后一段代码是进行回调的地方,也就是'event'字符串参数看起来很棒且充满可读字符的地方。然而,当代码在回调(C#)端停止时,字符串参数在编组之后似乎不可读或无法识别。
这里的任何帮助都会很精彩,因为通过回调来管理托管并通过回调回到托管是足够的麻烦。
C#:
public delegate void EventCallBackDelegate([In, MarshalAs(UnmanagedType.LPWStr)] string response, IntPtr uParam);
public static EventCallBackDelegate eventDelegate;
eventDelegate = new EventCallBackDelegate(EventCallbackFunction);
IntPtr eventCbPtr = Marshal.GetFunctionPointerForDelegate(eventDelegate);
jmcStatus = Mjmc.MgdJsonMsgClientRegisterEvents(eventCbPtr);
public void EventCallbackFunction([In, MarshalAs(UnmanagedType.LPWStr)] string response, IntPtr uParam)
{
jsonAuto = response;
MessageBox.Show("The Event Callback Function was invoked by the managed DLL");
}
托管DLL(包装器):
int MgdJsonMsgClientRegisterEvents(IntPtr eventCbPtr)
{
JsonMsgClient::EventCbPtr eventCb = static_cast<JsonMsgClient::EventCbPtr>(eventCbPtr.ToPointer());
return _JsonMsgClient->RegisterVelEvent(NULL, JsonMsgClient::USE_CB, eventCb);
}
C ++:
typedef void(_stdcall *EventCbPtr)(const string& event, const void* userParam);
JmsStatus::JsonMsgStatus JsonMsgClient::RegisterVelEvent
(
const void* userParam,
AutonomousMsgStrategy strategy,
JsonMsgClient::EventCbPtr cb
)
{
m_velEventStrategy = strategy;
if (strategy == USE_CB)
{
m_eventCb = cb;
m_eventUserParam = userParam;
}
else if (strategy == NOT_SUPPORTED)
{
m_eventCb = NULL;
m_eventUserParam = NULL;
}
return JmsStatus::JMS_ST_OK;
}
if (m_velEventStrategy == USE_CB)
{
if (m_eventCb != NULL)
{
m_eventCb(event, m_eventUserParam);
}
}