我有一个别人用C++写的DLL,可以调用的函数格式为int Login([in]const char* lpszAccount, [in]const char* lpszPassword, [in][out]TChar* lpszMessage, [in][out]int* lpszMessageBufferSize);我用C#调用这个函数[System.Runtime.InteropServices.DllImport("Login.dll", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static extern int Login(byte[] account, byte[] password, StringBuilder message, ref int bufferSize);public static int LoginMeIn(string account, string password, out message)
{
int bufferSize = 1024;
StringBuilder sb = new StringBuilder(bufferSize);
int result = Login(
System.Text.Encoding.Default.GetBytes(account),
System.Text.Encoding.Default.GetBytes(password),
sb,
ref bufferSize);
message = sb.ToString();
return result;
问题一:请问这里用到的byte[]数组以及StringBuilder都需要手动释放吗?
}
问题二:用StringBuilder传给C++的TChar*参数,是否正确的做法?请高手指点一下,谢谢!
public static extern int Login(byte[] account, byte[] password, StringBuilder message, ref int bufferSize);public static int LoginMeIn(string account, string password, out message)
{
int bufferSize = 1024;
StringBuilder sb = new StringBuilder(bufferSize);
int result = Login(
System.Text.Encoding.Default.GetBytes(account),
System.Text.Encoding.Default.GetBytes(password),
sb,
ref bufferSize);
message = sb.ToString();
return result;
问题一:请问这里用到的byte[]数组以及StringBuilder都需要手动释放吗?
}
问题二:用StringBuilder传给C++的TChar*参数,是否正确的做法?请高手指点一下,谢谢!
解决方案 »
- ComboBox绑值问题
- socket文件传输 运行问题
- owc11使用问题,指定的维对当前图表类型而言是无效的,这么解决?
- 拔掉网线出现ora12560,重新插上网线后,还有有这个错误,如何解决,不重起程序
- ExtractIconEx 参数匹配的问题
- True Basic:我机器上生成的c#的.exe文件,在另外一台机器上如何运行?
- 【交流】1个人累死累活赶完项目,老板加班费,分红一字不提,先要源代码!郁闷
- 关于ToString()和Convert.toString()的区别
- vs.net最新版是什么?
- CS中用到指针怎么编译?
- 控件开发,错在怎么不出效果(代码如下)
- 如何在C#中动态添加控件并调用它的事件?
[in][out]TChar* lpszMessage, [in][out]int* lpszMessageBufferSize);我用C#调用这个函数[System.Runtime.InteropServices.DllImport("Login.dll",
CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]public static extern int Login(byte[] account, byte[] password,
StringBuilder message, ref int bufferSize);public static int LoginMeIn(string account, string password, out message)
{
int bufferSize = 1024;
StringBuilder sb = new StringBuilder(bufferSize);
int result = Login(
System.Text.Encoding.Default.GetBytes(account),
System.Text.Encoding.Default.GetBytes(password),
sb,
ref bufferSize);
message = sb.ToString();
return result;
}
问题一:请问这里用到的byte[]数组以及StringBuilder都需要手动释放吗?
问题二:用StringBuilder传给C++的TChar*参数,是否正确的做法?请高手指点一下,谢谢!
二.msdn中有所有类型的等值转换表,自己可以查
LPSTR/ char* 可以用System.String 或 System.Text.StringBuilder代替
问题二, 但是传给C++可以考虑用, BYTE[]
而用StringBuilder最好是当托管代函数使用Unicode时,因为如果非托管函数使用的ANSI编码,而StringBuildr是Unicode编码,会降低性能!
综上所述:建议制定为CharSet=CharSet.Unicode,并用MarshalAs属性处理!
仅供参考!