检测到FatalExecutionEngineError

时间:2010-03-19 10:13:56

标签: .net

我在.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”并在顶部指定异常消息。

1 个答案:

答案 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);