2015-09-18 10 views
2

У меня есть C++ DLL, которую мне нужно использовать в проекте can C#.NullReferenceException на неуправляемом коде 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 раз. A 10º сбой кода с исключением NullReferenceException без ввода в событие, и у меня нет доступа к стоп-лоту ...

Кто-нибудь знает, в чем проблема?

ответ

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

Вы не сохраняете своего делегата в живых. Вы создаете экземпляр DataReceiveDelegate и передаете его GetFunctionPointerForDelegate. Но после того, как GetFunctionPointerForDelegate вернется, у делегата нет причин оставаться в живых. В какой-то момент он будет собран.

Держите делегата в управляемой переменной до тех пор, пока неуправляемая функция должна иметь возможность ее вызвать.

+1

Это было! Я потратил слишком много времени на это ... Спасибо. – amp

 Смежные вопросы

  • Нет связанных вопросов^_^