c#调用dll库。一个奇怪的问题~ 10C

现在要做的事情是需要用c#调用c++写的dll,当dll(dll怎样跟硬件通讯的不管)读取到卡片信息时,通过回调函数把卡片信息传递到C#这边来

 c# 这边调用此方法设置回调函数:
 [DllImport("TCP102_SDK.dll", EntryPoint = "?TCP102_InitCallBack@@YGEKPAU_CALLBACK_FUN@@@Z")]
 public unsafe static extern byte TCP105_InitCallBack(uint dwUser, ref CALLBACK_FUN p_call_back);troller@@YGEPADEE@Z")]
回调函数:
//STRUCT
        [StructLayout(LayoutKind.Sequential)]
        public struct CARD_NUMBER_MSG
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] ControllerIP;
            public uint CommandSeq;
            public uint ReaderID;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] CardID;
            public string print()
            {
                return "CARD_NUMBER_MSG information : ControllerIP:" + String.Format("{0}.{1}.{2}.{3}", ControllerIP[0], ControllerIP[1], ControllerIP[2], ControllerIP[3]) + " CommandSeq:" + CommandSeq + " ReaderID:  " + ReaderID + " CardID " + String.Format("{0}|长度:{1}", CardID[0], CardID.Length);
            }
        }

public delegate void ReadedCardNumber(uint dwUser, ref CARD_NUMBER_M
SG p_card_msg);

[StructLayout(LayoutKind.Sequential)]
        public struct CALLBACK_FUN
        {
            public ReadedCardNumber p_ReadedCardNumberCallBack;
        }
 c++里面的设置回调函数的代码:
 /******************************************************************************************************
* Function Name : TCP102SetReceivedDataCallBack
* Description   : 设置回调
* Arguments     : None.
* Output        : None.
* Return        : None.
* Note(s)       : None.
*******************************************************************************************************/
TCP102_SDK_API unsigned char __stdcall TCP102_InitCallBack(DWORD dwUser,CALLBACK_FUN *p_call_back)
{
    if((NULL==p_call_back)||(0==dwUser))
    {
        return  TCP102_ERR_PARAMETER;
    }

    //设置回调函数指针
    ReadedCardNumberCallBack = p_call_back->p_ReadedCardNumberCallBack;
    h_CallBackWindow = dwUser;

    return TCP102_ERR_OK;
}

要实现的功能就是正确的初始化、设置回调函数...后,当sdk有读到卡片数据后,将读到的数据通过回调函数传递到c#这边来。
现在的问题是,第一次触发dll把读到的卡片信息回调到c#这边可以正确执行。但第二次就报未实例化对象的错误了。想知道有大神遇到过这样的问题吗?求解答。(目前调试的结果是还没触发回调方法就报未实例化对象的错了,在想是不是没找到回调方法的指针地址.)

1个回答

你出现异常的代码是哪一行?有没有关闭读卡器或者重新初始化的代码没有调用?

u013047803
凡夫俗子_ http://blog.csdn.net/u013047803/article/details/77053112
接近 3 年之前 回复
u013047803
凡夫俗子_ 谢谢了,问题解决了。我这边是:实例化回调函数的时候是局部的,运行完某个回调函数C#就被GC回收了。解决的办法就是把回调函数声明成全局的。
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐