C++封装的结构体与函数形式如下:typedef struct _DS_INFO{
DWORD apid;
WORD hwid;
WORD flag;
DWORD real_ip_addr;
DWORD pseudo_ip_addr;
DWORD host_ip_addr;
BYTE mac[MACLEN];
}DS_INFO, *PDS_INFO;到处DLL:
IMPORT_EXPORT int SDKCI_FUNC dsc_EnumSearch(DWORD server_ip, WNDENUMSEARCHPROC lpenumproc);typedef int (CALLBACK* WNDENUMSEARCHPROC)(PDS_INFO);
我对应的C#转换调用形式如下:
 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
 public struct  DS_INFO
  {
            public uint apid;
            public ushort hwid;
            public ushort flag;
            public uint real_ip_addr;
            public uint pseudo_ip_addr;
            public uint host_ip_addr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public byte[] mac;
  } public delegate int ProcessDelegate(ref DS_INFO dsinfo);[DllImport(".\\NECI.dll",CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]         
 unsafe public static extern int dsc_EnumSearch(uint server_ip, ProcessDelegate lpenumproc); int EnumSearchProc( ref DS_INFO dsinfo)
  {
     Trace.WriteLine("call back ");
  }程序调用部分:
try
{
 ProcessDelegate newCallproc = new ProcessDelegate(EnumSearchProc);
 int   ret = dsc_EnumSearch(0xffffffff, newCallproc);
}
catch(Exception ex)
{
  throw ex;//System.ArgumentNullException 中第一次偶然出现的“未知模块”类型的异常
}
/////////////////
请问我上述封装有什么问题?DLL可以确定没有任何问题。有意帮忙调试的大侠,请留下EMAIL。

解决方案 »

  1.   

    ProcessDelegate newCallproc = new ProcessDelegate(EnumSearchProc);
    你声明在类中,声明为静态字段,应该可以。
      

  2.   

    你的意思是这样吗?
    static int EnumSearchProc( ref DS_INFO dsinfo)
      {
      Trace.WriteLine("call back ");
      }int ret = dsc_EnumSearch(0xffffffff, EnumSearchProc);依然提示同样的错误。去掉异常捕获,错误行就在dsc_EnumSearch。
    请大侠指点。
    要不留个EMAIL给我,发给你帮我看看,谢谢。
      

  3.   

    非常感谢MSDN论坛的kiddowong帮我解决了。
    public delegate int ProcessDelegate(ref DS_INFO dsinfo);改为 public delegate int ProcessDelegate(System.IntPtr dsinfo);之后用Marshal.PtrToStructure在回掉函数里将Ptr转换为对应的结构体或者结构体数组。