我在DLL中,写入了完成端口的框架代码,然后导出标准函数给.Net
.Net 调用 Nativa Win32 Dll非常简单,我导出的函数大致为:
1.初始化函数 监听初始化并AcceptEx,启动工作者线程池
2.停止监听
3.向某SOCKET发送数据
4.设置某SOCKET的回调,当数据WSARecv的时候,调用此回调将数据传递给.Net处理
问题:
1. .Net没有函数的概念,那么当一个操作完成的时候,我怎样才能用回调的方式调用.Net某静态方法呢?2. 数据类型转换的问题. 我收到的数据都是内存BYTE数据。对于int long 之类都能找到.Net的数据类型对应。 但对于WCHAR的字符串应该用什么数据类型对应?

解决方案 »

  1.   

    我感觉写一个静态类封装此DLL比较可行,不过。NET本身使用的IO模型就是完成端口,或重叠的。
      

  2.   

    委托是 类的实现方式
    而回调是函数指针的方式怎么可以把委托作为函数指针传递呢??
    -
    WCHAR肯定是2byte, 但是怎样把他转到string类型呢
      

  3.   

    .Net本身的异步调用确实在机制上采用了完成端口但没完全发挥出完成端口的性能我的DLL中采用 ACE作为中间件, 对消息进行了预处理, 包括消息的分割 检测 以及粘包 拼包操作我尝试在.Net里面用, 太麻烦了 ,  导入1堆的API还搞得好晕
    在.Net里面一下要写unsafe代码才能做到, 所以还是采用DLL + .Net的机制
    DLL负责通信底层 
    .Net负责业务处理
      

  4.   

    1、委托,委托被封送到DLL后就会被转换成函数指针。这是自动的,你不需要关心!
    2、WCHAR 用String,要加上自定义属性:CharSet=CharSet.Unicode 。
      

  5.   

    1、委托,委托被封送到DLL后就会被转换成函数指针。这是自动的,你不需要关心!
    --------我只见过 委托能关联到 COM的回调接口但我现在是函数指针, 怎么自动转换?
    i.e.
    typedef VOID (*PFN_OnDataRecv)( _int32 nMsgType, _int32 nSize, LPBYTE * lpBuf); 导出标准函数 SetRecvFun( LPVOID lpFun)那如何将委托传递进去?
      

  6.   

    SORRY
    2 没看清
    WCHAR  用 STRING ,注意参数的编码给是
    charset
      

  7.   

    SetRecvFun( LPVOID lpFun)
    在C#中这样定义:
    SetRecvFun(Delegate lpFun)