我有一个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 ...
任何人都知道可能出现什么问题?
答案 0 :(得分:2)
MTSCRA_API.OnDataReceived(
Marshal.GetFunctionPointerForDelegate(
new Kiosk.Hardware.CardReaderMagTek.MTSCRA_API.DataReceiveDelegate(
CardReaderMagTek_OnCardDataReceived)
)
);
你没有让你的代表活着。您创建DataReceiveDelegate
的实例并将其传递给GetFunctionPointerForDelegate
。但是在GetFunctionPointerForDelegate
返回后,代表没有理由保持活着。在某些时候它将被收集。
只要非托管函数需要能够调用它,就将代理保存在托管变量中。