public delegate void PDeliver(deliverstr deliver);.....
startup(....,a_PDeliver)
..... private void a_PDeliver(deliverstr deliver)
{
try
{
....//在此中断,调试的时候,能看到deliver是有正确数据返回的
}
catch(Exception ec)
{
....
}
}
一旦程序运行到a_PDeliver,程序就自动关闭,哪怕把这个方法设置为空方法,程序照样自动关闭!
startup(....,a_PDeliver)
..... private void a_PDeliver(deliverstr deliver)
{
try
{
....//在此中断,调试的时候,能看到deliver是有正确数据返回的
}
catch(Exception ec)
{
....
}
}
一旦程序运行到a_PDeliver,程序就自动关闭,哪怕把这个方法设置为空方法,程序照样自动关闭!
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;
}
因为dll是C++写的,不知道是不是内存非法访问问题.在日志里也没看到任何错误,就直接挂了~
你还是在dll里面加几句debug信息,看dll的函数进去了没,还有定位下挂在哪里,看看挂掉的地方跟你回掉函数有没有关系
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的回调
[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实际获取到的是没有数据
//此函数保持为空
}
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++申明