C# 不同螺纹中的PInvoke FatalexecutionEngineer错误
我的代码运行良好,但在5-10分钟后,我得到以下错误 托管调试助手“FatalExecutionEngineError”:“运行时遇到致命错误。错误地址位于线程0x5d0c上的0x641ad419。错误代码为0xc0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM互操作或PInvoke的用户封送错误,这可能会损坏堆栈 从不同线程调用C# 不同螺纹中的PInvoke FatalexecutionEngineer错误,c#,C#,我的代码运行良好,但在5-10分钟后,我得到以下错误 托管调试助手“FatalExecutionEngineError”:“运行时遇到致命错误。错误地址位于线程0x5d0c上的0x641ad419。错误代码为0xc0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM互操作或PInvoke的用户封送错误,这可能会损坏堆栈 从不同线程调用 InvokeUtil.getInstance.Calculate(localVal); 我的代码 public
InvokeUtil.getInstance.Calculate(localVal);
我的代码
public class InvokeUntil
{
private IntPtr m_object = IntPtr.Zero;
private static InvokeUntil Self;
private InvokeUntil()
{
this.m_object = InvokeUntil.DllCreateInstance();
}
[DllImport("xDll")]
private static extern IntPtr DllCreateInstance();
[DllImport("xDll")]
private static extern void DllDisposeInstance(IntPtr CSObject);
[DllImport("xDll")]
private static extern void DllCalculate(IntPtr pCSObject, byte[] pCurrentData, uint[] pResult);
public static InvokeUntil getInstance
{
get
{
if (InvokeUntil.Self == null)
InvokeUntil.Self = new InvokeUntil();
return InvokeUntil.Self;
}
}
public void Calculate(uint[] EffVal)
{
InvokeUntil.DllCalculate(m_object, Data.MyData, EffVal);
}
}
乍一看,我想这可能是一个并发问题。我看到DLL支持
DllCreateInstance
方法,这似乎表明它维护某种状态。调用DLL中的DllCalculate
线程安全吗?我猜not@Martin显然,我看不到dll内容。但你的意思是我应该打电话;InvokeUtil.DllDisposeInstance(m_对象);我的意思是m_object
的实例不是线程安全的,因此多次同时调用它会导致并发问题。由于它是间歇性故障,通常会发生两种情况:1)它是对齐问题。您的应用程序会得到一个以字节为单位的内存范围。如果未将编译器选项设置为与dll一致,则如果对齐模式(1,2,4,8字节)设置正确,则可能会超出内存大小数个字节2)问题出在dll代码中。DllCalCalculate()无法安全写入,它不知道数组可能有多大。在数组末尾之外写入会损坏GC堆,最终在垃圾收集器注意到损坏时触发FEEE。通过添加一个传递efffal.Length的参数进行修复,以便现在可以进行正确的错误检查。