C# 不同螺纹中的PInvoke FatalexecutionEngineer错误

C# 不同螺纹中的PInvoke FatalexecutionEngineer错误,c#,C#,我的代码运行良好,但在5-10分钟后,我得到以下错误 托管调试助手“FatalExecutionEngineError”:“运行时遇到致命错误。错误地址位于线程0x5d0c上的0x641ad419。错误代码为0xc0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM互操作或PInvoke的用户封送错误,这可能会损坏堆栈 从不同线程调用 InvokeUtil.getInstance.Calculate(localVal); 我的代码 public

我的代码运行良好,但在5-10分钟后,我得到以下错误

托管调试助手“FatalExecutionEngineError”:“运行时遇到致命错误。错误地址位于线程0x5d0c上的0x641ad419。错误代码为0xc0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM互操作或PInvoke的用户封送错误,这可能会损坏堆栈

从不同线程调用

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的参数进行修复,以便现在可以进行正确的错误检查。