public delegate void PDeliver(deliverstr deliver);.....
startup(....,a_PDeliver)
.....        private void a_PDeliver(deliverstr deliver)
        {
            try
            {
               ....//在此中断,调试的时候,能看到deliver是有正确数据返回的
            }
            catch(Exception ec)
            {
               ....
            }
        }
一旦程序运行到a_PDeliver,程序就自动关闭,哪怕把这个方法设置为空方法,程序照样自动关闭!

解决方案 »

  1.   

            [StructLayout(LayoutKind.Sequential)]
            public struct deliverstr
            {
                public UInt32 sequencenumber1;
                public UInt32 sequencenumber2;
                public UInt32 sequencenumber3;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 22)]
                public String usernumber;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 22)]
                public String spnumber;
                public byte tp_pid;
                public byte tp_udhi;
                public byte messagecoding;
                public UInt32 messagelength;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 160)]
                public String messagecontent;
            }
      

  2.   

    dll回调要用delegate吧,而不是直接使用函数startup(....,a_PDeliver) 改成startup(....,new PDeliver(a_PDeliver))试试 
      

  3.   

    还是一样,一旦该回调函数一触发就会导致程序自动关闭.
    因为dll是C++写的,不知道是不是内存非法访问问题.在日志里也没看到任何错误,就直接挂了~
      

  4.   

    那就不知道了
    你还是在dll里面加几句debug信息,看dll的函数进去了没,还有定位下挂在哪里,看看挂掉的地方跟你回掉函数有没有关系
      

  5.   

        public delegate int dlBussPack485([MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Struct, SizeConst = 61)]TMessage485[] pack485, int recCount, [In, Out][MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Struct, SizeConst = 61)]  TMessage485[] returnPack485, int returnCount, int count);
        public delegate int dlTest(ref TMessage485[] returnpack485, int count);       /// <summary>
            /// 启动TCP服务 
            /// </summary>
            /// <param name="outTime">读取数据超时</param>
            /// <param name="sendTime">处理数据超时</param>
            /// <param name="port">开启的TCP端口</param>
            /// <param name="dealFunc">函数委托,回调</param>
            /// <returns>True 表示成功 False表示失败</returns>
            [DllImport(DLLName, CharSet = CharSet.Ansi)]
            public static extern Boolean RunServer(int outTime, int sendTime, int port, [MarshalAs(UnmanagedType.FunctionPtr)] dlBussPack485 dealFunc);
    给你一个参考样本吧。
    c#与DELPHI7的回调
      

  6.   

    我尝试了这么干,但是程序还是会退出public delegate void PDeliver([MarshalAs(UnmanagedType.Struct)]deliverstr deliver);
    [DllImport("SGIP.dll", SetLastError=true)]
    private static extern int Startup([MarshalAs(UnmanagedType.FunctionPtr)]PDeliver func)
    Startup(a_PDeliver)
    private void PDeliver(deliverstr deliver)
    {
    //中断调试,deliver能正常返回为一个带数据的结构
    //此函数保持为空
    }也试了这么干,虽然程序不退出了,但是返回值不正确public delegate void PDeliver(IntPtr deliver);
    [DllImport("SGIP.dll", SetLastError=true)]
    private static extern int Startup(PDeliver func)
    Startup(a_PDeliver)
    private void PDeliver(IntPtr deliver)
    {
      deliverstr mo_pkg = new deliverstr();
      mo_pkg = (deliverstr)Marshal.PtrToStructure(deliver, typeof(deliverstr));
    //中断调试,deliver的返回结果为实际结构集中的一个值,mo_pkg实际获取到的是没有数据
    //此函数保持为空
    }
      

  7.   

    [StructLayout(LayoutKind.Sequential)] 
            public struct deliverstr 
            { 
                public UInt32 sequencenumber1; 
                public UInt32 sequencenumber2; 
                public UInt32 sequencenumber3; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 22)] 
                public String usernumber; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 22)] 
                public String spnumber; 
                public byte tp_pid; 
                public byte tp_udhi; 
                public byte messagecoding; 
                public UInt32 messagelength; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 160)] 
                public String messagecontent; 
            }
    感觉这个结构体有问题?
    能不能贴出它的c++申明
      

  8.   

    你的delegate对象在回调前被GC了。你需要确保你的delegate能存活到回调触发。
      

  9.   

    感觉这里少了一个很重要的PACK参数,一般用来跨程序访问的结构体,都被严格PACK啦。