我正在使用第三方专有DLL,但我无法获得源代码。但是,使用SWIG 1.3.39自动生成的包装代码可供我使用。包装器代码包含一个C ++文件,它编译(使用一些描述DLL的头文件)到DLL和一个C#项目,它使PInvoke调用C ++包装器DLL。
在检查StackTrace后,我得到了以下信息:
at org.doubango.tinyWRAP.tinyWRAPPINVOKE.MediaSessionMgr_consumerSetInt64(HandleRef jarg1, Int32 jarg2, String jarg3, Int64 jarg4)
at Deskcon_ABL.NotificationHandler.sipService_onInviteEvent(Object sender, InviteEventArgs e)
at BogheCore.Events.EventHandlerTrigger.TriggerEvent[T](EventHandler`1 handler, Object source, T args)
at BogheCore.Services.Impl.SipService.MySipCallback.OnDialogEvent(DialogEvent e)
at org.doubango.tinyWRAP.SipCallback.SwigDirectorOnDialogEvent(IntPtr e)
所以这是违规的C#代码:
//in the C# Wrapper
public bool consumerSetInt64(twrap_media_type_t media, string key, long value) {
bool ret = tinyWRAPPINVOKE.MediaSessionMgr_consumerSetInt64(swigCPtr, (int)media, key, value);
return ret;
}
//In tinyWRAPPINVOKE Class in another file in the C# wrapper:
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_consumerSetInt64")]
public static extern bool MediaSessionMgr_consumerSetInt64(HandleRef jarg1, int jarg2, string jarg3, long jarg4);
来自C ++包装器的C ++代码:
SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_consumerSetInt64(void * jarg1, int jarg2, char * jarg3, long long jarg4) {
unsigned int jresult ;
MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ;
twrap_media_type_t arg2 ;
char *arg3 = (char *) 0 ;
int64_t arg4 ;
bool result;
arg1 = (MediaSessionMgr *)jarg1;
arg2 = (twrap_media_type_t)jarg2;
arg3 = (char *)jarg3;
arg4 = (int64_t)jarg4;
result = (bool)(arg1)->consumerSetInt64(arg2,(char const *)arg3,arg4);
jresult = result;
return jresult;
}
答案 0 :(得分:0)
它可能是DllImport中的第一个(void *)或第三个(char *)参数。 你能否展示你正在创建的代码并为这两者分配你传递的内容?
您可以尝试更改其中一个或两个的编组,可能是以下内容:
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_consumerSetInt64")]
public static extern bool MediaSessionMgr_consumerSetInt64(IntPtr jarg1, int jarg2, StringBuilder jarg3, long jarg4);
但是,如果你有更多关于使用这些参数的信息,那么也可能有助于识别问题。