首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#调用C dll出现的有关问题

2013-11-08 
C#调用C dll出现的问题C dll 代码中的输出函数1extern C__declspec(dllexport)int ConnectServer(charcU

C#调用C dll出现的问题
C dll 代码中的输出函数1
extern "C"  __declspec(dllexport)  int ConnectServer(charcUser[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);
        }


如果,你的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);

热点排行