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);
}
[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);