我在.net应用程序中使用非托管dll并获取异常时遇到问题 “运行时遇到致命错误。错误地址为0x79e71bd7,位于线程0xbb4。错误代码为0xc0000005。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。“
我的代码在下面......
[DllImport("ITMSDLL.dll")]
internal static extern int get_month_mask(ref String theMask,ref String theByt, int theSt_Dow, int theSt_Week, int theEn_Dow, int theEn_Week);
并通过C#中的以下方法调用此方法
public int GetMonthMask(ref String theMask,ref String theByt, int theSt_Dow, int
theSt_Week, int theEn_Dow, int theEn_Week)
{
return CITMSDLLMethods.get_month_mask(ref theMask, ref theByt, theSt_Dow,
theSt_Week, theEn_Dow, theEn_Week);
}
以上两种方法来自.net。
中的包装dll以下代码调用上述方法
aRc = Utility.objCITMSDLL.GetMonthMask(ref aRetMask,ref aMByte, aSt_Dow, aSt_Wk, aEn_Dow, aEn_Wk);
调用此方法时会抛出异常“检测到FatalExecutionEngineError”并在顶部指定异常消息。
答案 0 :(得分:1)
当非托管方法在char缓冲区中返回一个字符串时,它通常映射到.NET中的StringBuilder,而不是String。
以下是GetWindowText的示例,直接来自pinvoke
int GetWindowText(HWND hWnd,LPTSTR lpString,int nMaxCount);
变为:
static extern int GetWindowText(IntPtr hWnd,StringBuilder lpString,int nMaxCount);