C dll 代码中的输出函数1
extern "C"  __declspec(dllexport)  int ConnectServer(char cUser[64],
char cPass[64],char cIp[32],char cNEName[64]);C#对应的函数形式我写成如下:
public static extern int ConnectServer(byte[] cUser, byte[] cPass, byte[] cIp, byte[] cNEName);
            
这样使用:
            byte[] user = new byte[64];
            byte[] password = new byte[64];
            byte[] ip = new byte[32];
            byte[] NEName = new byte[64];
            ConnectServer(user, password, ip, NEName);最后报错,报错内容:外部组件发生异常,难道是我的参数类型有问题?
C dll 代码中的输出函数2
extern "C"  __declspec(dllexport)  void disConnectServer();
C#对应的函数形式
public static extern void disConnectServer();
这个连参数也没有,调用后报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
请问大概是什么原因,是我的C dll有问题,还是C#的使用方法有问题,谢谢!CDLLC#__declspecDllImport

解决方案 »

  1.   

    你可以这样声明:
            [DllImport("youdll.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern int ConnectServer([MarshalAs(UnmanagedType.LPStr)] StringBuilder cUser, [MarshalAs(UnmanagedType.LPStr)] StringBuilder cPass, [MarshalAs(UnmanagedType.LPStr)] StringBuilder clp, [MarshalAs(UnmanagedType.LPStr)] StringBuilder cNEName);调用:
     public void CallTest()
            {
                StringBuilder cUser = new StringBuilder("username".PadRight(64, (Char)0));
                StringBuilder cPass = new StringBuilder("Password".PadRight(64, (char)0));
                StringBuilder clp = new StringBuilder("clpvalue".PadRight(64, (char)0));
                StringBuilder cNEName = new StringBuilder("cnenameValue".PadRight(64, (char)0));            int ret = ConnectServer(cUser, cPass, clp, cNEName);
            }如果,你的ConnectServer内部,不会修改参数,也可以这样声明:         [DllImport("youdll.dll", CallingConvention = CallingConvention.Cdecl)]
             public static extern int ConnectServer([MarshalAs(UnmanagedType.LPStr)] string cUser, [MarshalAs(UnmanagedType.LPStr)] string cPass, [MarshalAs(UnmanagedType.LPStr)] string clp, [MarshalAs(UnmanagedType.LPStr)] string cNEName);
      

  2.   

    __stdcall 
    或者 CallingConvention 
      

  3.   

    谢谢,这个答案是正解,我之前出问题的原因是参数问题吗?还是CallingConvention = CallingConvention.Cdecl设置问题?
      

  4.   

    如果CallingConvention指定不正确会出现栈不平衡,函数调用完成后续就会出错。事实上如果你了解得更深一些,使用byte[]也是可以的。
    这取决你于你在调用的时候,对byte[]是否进行了正确赋值。
      

  5.   

    我取消了CallingConvention,确实出现了栈不平衡,谢谢,后面有问题再咨询您。