日期:2014-05-17  浏览次数:20736 次

C#调用C dll出现的问题
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#的使用方法有问题,谢谢!
C? CDLL C# __declspec DllImport

------解决方案--------------------
你可以这样声明:
     
   [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);
        }