C#传给C++写的DLL参数需要手动释放资源吗?

Shadal 2009-09-21 06:02:59
我有一个别人用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*参数,是否正确的做法?

请高手指点一下,谢谢!
...全文
200 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shadal 2009-09-24
  • 打赏
  • 举报
回复
谢谢各位的帮忙!
zhangjiewoshiwo 2009-09-22
  • 打赏
  • 举报
回复
噢。。。。不好意思我上面只回答了你的第一个问题,呵呵。。。。没注意看!第二个问题,我用的时候把所有的char * 类型的都用IntPtr类型来代替的,不管是传入的参数还是传出的都用IntPtr,不知道你那行不行。。。。可以试试!
zhangjiewoshiwo 2009-09-22
  • 打赏
  • 举报
回复
我最近也在一个测试工具软件中调用了C++的DLL文件,在C#中申明的变量如:byte[] 不用释放,但是你调用的c++的函数传进去的参数,需要释放,具体怎么释放你可以看DLL文件的导出函数,里面应该会包含释放资源的函数,调用就OK啦!我的就是这样的,我的是调用里面的一个void release();释放的,具体参看DLL文件的导出函数工具可以上google搜下eXeScope这个工具,很好用直接把DLL文件导进去就可以看导出函数了,希望对LZ有点帮助。。。。。
Joetao 2009-09-21
  • 打赏
  • 举报
回复
因为是C++,在ANSI或MBCS下 TCHAR 在ANSI下可以转换成const char*,在Unicode下,可以转换成const wchar_t,以为楼主C++函数没指定 CharSet的形式,默认就是Charset=CharSet.Ansi,所以这里的TCHAR就相当于const char*.
而用StringBuilder最好是当托管代函数使用Unicode时,因为如果非托管函数使用的ANSI编码,而StringBuildr是Unicode编码,会降低性能!
综上所述:建议制定为CharSet=CharSet.Unicode,并用MarshalAs属性处理!
仅供参考!
Shadal 2009-09-21
  • 打赏
  • 举报
回复
对于TChar*,如果传byte[]会出错,传StringBuilder没事
hezuohua2008 2009-09-21
  • 打赏
  • 举报
回复
2楼正解。
足球中国 2009-09-21
  • 打赏
  • 举报
回复
自我感觉不需要。
mao924 2009-09-21
  • 打赏
  • 举报
回复
不需要
linguanyu315 2009-09-21
  • 打赏
  • 举报
回复
问题一,不用, 如果没有在C#中使用指针,就是安全的代码,不用释放.
问题二, 但是传给C++可以考虑用, BYTE[]
peng_yaoming 2009-09-21
  • 打赏
  • 举报
回复
不懂 c++
关注着
TTOJJ 2009-09-21
  • 打赏
  • 举报
回复
TChar*是char*的unicode版本
TTOJJ 2009-09-21
  • 打赏
  • 举报
回复
一.不用,因为这个byte[]还是拖管的
二.msdn中有所有类型的等值转换表,自己可以查
LPSTR/ char* 可以用System.String 或 System.Text.StringBuilder代替
Shadal 2009-09-21
  • 打赏
  • 举报
回复
我有一个别人用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*参数,是否正确的做法?

请高手指点一下,谢谢!

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧