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 CDLLC#__declspecDllImport
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 CDLLC#__declspecDllImport
[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);
或者 CallingConvention
这取决你于你在调用的时候,对byte[]是否进行了正确赋值。