非托管 C++ 代码上的 NullReferenceException

NullReferenceException on unmanaged c++ code

我有一个 C++ DLL 需要在 may c# 项目中使用。

这是我的代码的重要部分:

public static class MTSCRA_API
{
    [UnmanagedFunctionPointer(CallingConvention.StdCall)]
    public delegate void DataReceiveDelegate([MarshalAsAttribute(UnmanagedType.LPStr)]String x);

    //More methods....

    [DllImport("MTSCRA.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto, SetLastError = true)]
    public static extern void OnDeviceConnectionStateChanged(IntPtr lpFuncNotify);

}

我在哪里使用它:

public void Open()
        {
            if (!MTSCRA_API.IsDeviceConnected())
            {
                UInt32 result = MTSCRA_API.OpenDevice("");
                if (result == 0)
                {
                    MTSCRA_API.OnDataReceived(
                        Marshal.GetFunctionPointerForDelegate(
                        new Kiosk.Hardware.CardReaderMagTek.MTSCRA_API.DataReceiveDelegate(CardReaderMagTek_OnCardDataReceived)));
                }
            }
    }

    Mutex mutex = new Mutex();
    void CardReaderMagTek_OnCardDataReceived(String info)
    {
        try
        {
             //Do stuff
        }
        catch(Exception ex)
        {

        }
        finally
        {
            mutex.ReleaseMutex();
        }
        MTSCRA_API.ClearCardData();
        info = null;

    }

每次我在设备上刷卡时,都会调用 CardReaderMagTek_OnCardDataReceived() 事件。

执行了Open()方法,调用了事件CardReaderMagTek_OnCardDataReceived()但只有9次。 10º 代码因 NullReferenceException 而崩溃,而没有进入事件,我无权访问调用堆栈...

有人知道可能是什么问题吗?

MTSCRA_API.OnDataReceived(
    Marshal.GetFunctionPointerForDelegate(
    new Kiosk.Hardware.CardReaderMagTek.MTSCRA_API.DataReceiveDelegate(
        CardReaderMagTek_OnCardDataReceived)
    )
);

你没有让你的代表活着。您创建 DataReceiveDelegate 的实例并将其传递给 GetFunctionPointerForDelegate。但是在 GetFunctionPointerForDelegate returns 之后,代表没有理由继续存活。在某个时候它会被收集。

只要非托管函数需要能够调用它,就将委托保留在托管变量中。