非托管c ++代码的NullReferenceException

时间:2015-09-18 11:14:13

标签: c# c++ dllimport unmanaged

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

以下是我的代码的重要部分:

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没有进入事件,我无法访问callstack ...

任何人都知道可能出现什么问题?

1 个答案:

答案 0 :(得分:2)

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

你没有让你的代表活着。您创建DataReceiveDelegate的实例并将其传递给GetFunctionPointerForDelegate。但是在GetFunctionPointerForDelegate返回后,代表没有理由保持活着。在某些时候它将被收集。

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