C 宏 里有如下几个函数      int OPENSSL_init(int mode);
      
      void* OPENSSL_connect(Socket s);      int OPENSSL_read(void* sslsock, void *buf, int num);
      
      OPENSSL_write( void* sslsock, const void *buf,int num );
                  
      int OPENSSL_shutdown( void* sslsock );
        
       void OPENSSL_uninit( );
当 宏 生成动态链接库 dll后
我在C# 里调用
         //调用 SSL动态链接库 初始化函数
         [DllImport("SSLLib.dll", EntryPoint = "OPENSSL_init")]
          public extern int OPENSSL_init(int mode);
         //调用 SSL动态链接库 连接函数
         [DllImport("SSLLib.dll", EntryPoint = "OPENSSL_connect")]
         public static extern void* OPENSSL_connect(Socket s);
         //调用 SSL动态链接库 读取函数
         [DllImport("SSLLib.dll", EntryPoint = "OPENSSL_read")]
         public  static extern int OPENSSL_read(void* sslsock, void* buf, int num);
         //调用 SSL动态链接库 写入函数
         [DllImport("SSLLib.dll", EntryPoint = "OPENSSL_write")]
          public static int OPENSSL_write( void* sslsock, void *buf,int num );
         //调用 SSL动态链接库 关闭函数
         [DllImport("SSLLib.dll", EntryPoint = "OPENSSL_shutdown")]
          public static extern int OPENSSL_shutdown( void* sslsock );
         //调用 SSL动态链接库 注消SSL库,回收SSL库函数
         [DllImport("SSLLib.dll", EntryPoint = "OPENSSL_uninit")]
          public static extern void OPENSSL_uninit( );上面这样调用显然是会报错,指针和固定大小缓冲区只能在不安全的上下文中使用
那么应该怎样正确调用或者说应该怎样把C里的函数转换为c#里可以使用的?急用。万分感谢。希望大家帮帮忙
  

解决方案 »

  1.   

    void* OPENSSL_connect(Socket s);
    这个会有问题 - Socket不是基本类型,C#没有直接对应的类。
      

  2.   

    指针转化成引用即可void *可以换成ref Byte
      

  3.   

    我猜测一下这个功能
    void* OPENSSL_connect(Socket s)这个函数是不是返回一个标记,就是自己定义了一个被连接的对象,可以是数字也可以是字符串或者结构体什么的,int OPENSSL_read(void* sslsock, void *buf, int num)这里面的sslsock指的就是connect函数所返回的对象?如果是这样的话,假定用数字来标记这个被连接的对象,可以改为以下的
    int OPENSSL_init(int mode);
    IntPtr OPENSSL_connect(IntPtr s);其中s是所要连接的socket的Handle,返回的IntPtr可以用Marshal.ReadInt32读取到一个整数标识。
    int OPENSSL_read(IntPtr sslsock, Byte[] buf, int num);其中sslock是前面一个函数返回的IntPtr,buf是自己定义的一个数组,里面是要被写入接收数据的,num是接收长度。
    OPENSSL_write(IntPtr sslsock, Byte[] buf,int num );参数同上,不过buf里面是要发送的数据。
    int OPENSSL_shutdown(IntPtr sslsock );参数同上
    void OPENSSL_uninit( );