[DllImport("DSStream.dll", EntryPoint = "DSStream_Initialize")]
        public static extern bool DSStream_Initialize();
        [DllImport("DSStream.dll", EntryPoint = "DSStream_Uninitialize")]
        public static extern void DSStream_Uninitialize();
        [DllImport("DSStream.dll", EntryPoint = "DSStream_ConnectDevice")]
        public static extern bool DSStream_ConnectDevice(int iCardID, bool bOverlay, IntPtr hParentWnd);  bool num = SdkApi.DSStream_Initialize();
            SdkApi.DSStream_ConnectDevice(0, false, this.Handle);对 PInvoke 函数“Demo!Demo.SdkApi::DSStream_ConnectDevice”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jun1986129x/archive/2011/03/14/6248272.aspx

解决方案 »

  1.   

    int iCardID, bool bOverlay改成short iCardID, short bOverlay
    调用时
    SdkApi.DSStream_ConnectDevice(0, 0, this.Handle);
      

  2.   

    应该是DSStream_ConnectDevice参数的数据类型声明不对
    我曾经碰到过,在自己的机器上声明为long,运行没问题,换了台机器后就报签名不匹配,换成int就没事了
    一直很费解
      

  3.   


    WinAPI的long类型是32位的,而C#的long是64位的,会引发PInvokeStackImbalance错误。因此需要将原来的long类型改为int类型,C#中int是32位的
      

  4.   

     添加属性:CallingConvention=CallingConvention.Cdecl
    http://blog.csdn.net/wjeson/article/details/8263320