社区
C#
帖子详情
c#如何释放dll返回的字符串?
DreamTiger
2010-06-26 03:57:04
一个vc的dll,在c#中返回一个字符串:
[DllImport("a.dll", EntryPoint = "A_Receive")]
public static extern uint A_Receive(string A_Type, out string A_Text);
在C#中,随着不断的调用,系统内存会被耗尽。对于这种在dll里面分配的内存,在C#中需要特殊处理进行释放么?或者定期执行GC.Collect();就可以了?
...全文
379
14
打赏
收藏
c#如何释放dll返回的字符串?
一个vc的dll,在c#中返回一个字符串: [DllImport("a.dll", EntryPoint = "A_Receive")] public static extern uint A_Receive(string A_Type, out string A_Text); 在C#中,随着不断的调用,系统内存会被耗尽。对于这种在dll里面分配的内存,在C#中需要特殊处理进行释放么?或者定期执行GC.Collect();就可以了?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
兔子-顾问
2010-06-26
打赏
举报
回复
是存在msdn上介绍的可能,但是如果没有详细说明,一般设计的时候。尽量不要这样设计,谁申请谁释放,这毕竟是c/c++沿用至今的方法。vc.net具有操作托管代码的能力,但这绝对不是值得推荐的。
DreamTiger
2010-06-26
打赏
举报
回复
[Quote=引用 10 楼 deyter 的回复:]
引用 8 楼 dreamtiger 的回复:
引用 7 楼 whslovexyp 的回复:
不可否认,这个dll很垃圾,但现在没有办法,呵呵。
既然很垃圾,那就反编译这个dll,你自己重新写个就是的
[/Quote]
反编译一个c++的dll,重写就太费劲了。呵呵。
DreamTiger
2010-06-26
打赏
举报
回复
[Quote=引用 11 楼 wuyazhe 的回复:]
引用 2 楼 whslovexyp 的回复:
谁申请,谁释放。
你用dll来申请的内存,应该由dll来释放,自己再开个释放函数吧
非常赞同。但最后说开个函数释放,有点误导。
没什么补充的,谁申请,谁释放。说的很准确了。不是你申请的内存,就不要释放,托管内存就让gc自己处理好了。关闭窗体时候,你可以尝试手工调用gc.collect,因为关闭毕竟是很少做的操作。不要大量的调用gc.c……
[/Quote]
首先,在clr里面不释放的结果就是内存泄漏,也就是本问题希望解决的。
其实也不是绝对谁申请,谁释放,像下面文章说的那样,也可以dll里面申请,clr里面会自动释放,但要求dll里面是通过CoTaskMemAlloc 申请的内存:
http://msdn.microsoft.com/zh-cn/magazine/cc164193.aspx
由于这个原始的dll也不知道什么方式申请的,但从clr没有自动释放内存来看,应该不是通过CoTaskMemAlloc。就是不知道是否能用非托管方式,像调用c++里面的delete一样来释放内存。
兔子-顾问
2010-06-26
打赏
举报
回复
[Quote=引用 2 楼 whslovexyp 的回复:]
谁申请,谁释放。
你用dll来申请的内存,应该由dll来释放,自己再开个释放函数吧
[/Quote]
非常赞同。但最后说开个函数释放,有点误导。
没什么补充的,
谁申请,谁释放。
说的很准确了。不是你申请的内存,就不要释放,托管内存就让gc自己处理好了。关闭窗体时候,你可以尝试手工调用gc.collect,因为关闭毕竟是很少做的操作。不要大量的调用gc.collect就好了。
deyter
2010-06-26
打赏
举报
回复
[Quote=引用 8 楼 dreamtiger 的回复:]
引用 7 楼 whslovexyp 的回复:
不可否认,这个dll很垃圾,但现在没有办法,呵呵。
[/Quote]
既然很垃圾,那就反编译这个dll,你自己重新写个就是的
小夏天~
2010-06-26
打赏
举报
回复
学习...
DreamTiger
2010-06-26
打赏
举报
回复
[Quote=引用 7 楼 whslovexyp 的回复:]
非托管模式?那你C#还能用吗?
如果dll别人提供的,只能说这个dll很垃圾
[/Quote]
不可否认,这个dll很垃圾,但现在没有办法,呵呵。
whslovexyp
2010-06-26
打赏
举报
回复
非托管模式?那你C#还能用吗?
如果dll别人提供的,只能说这个dll很垃圾
DreamTiger
2010-06-26
打赏
举报
回复
[Quote=引用 3 楼 yaazz 的回复:]
这不应属于托管资源,需要Dll自己提供释放接口吧
[/Quote]
dll本身是不提供释放接口,也没法修改。那在非托管模式下能释放么?
DreamTiger
2010-06-26
打赏
举报
回复
[Quote=引用 2 楼 whslovexyp 的回复:]
谁申请,谁释放。
你用dll来申请的内存,应该由dll来释放,自己再开个释放函数吧
[/Quote]
问题就在于这个dll不是自己写的,没有办法修改了。
DreamTiger
2010-06-26
打赏
举报
回复
[Quote=引用 1 楼 wuzhanhui 的回复:]
通过反编译啊
[/Quote]
反编译以后能解决内存问题?
yaazz
2010-06-26
打赏
举报
回复
这不应属于托管资源,需要Dll自己提供释放接口吧
whslovexyp
2010-06-26
打赏
举报
回复
谁申请,谁释放。
你用dll来申请的内存,应该由dll来释放,自己再开个释放函数吧
wuzhanhui
2010-06-26
打赏
举报
回复
通过反编译啊
使用
C#
调用C++
DLL
中的char**数据结构转换
GetStringArray函数
返回
一个指向
字符串
数组的指针,我们使用Marshal类的PtrToStringAnsiArray方法将该指针转换为
C#
中的
字符串
数组。最后,我们遍历并输出
字符串
数组的内容。下面是一个示例,展示了如何在
C#
中调用C++
DLL
中的char**数据结构,并进行正确的转换和处理。请注意,在使用完
字符串
数组后,我们需要调用FreeStringArray函数
释放
在C++中分配的内存。这样,我们就成功地在
C#
中调用了C++
DLL
中的char**数据结构,并进行了正确的转换和处理。
c#
char unsigned_unsigned char型**相当于C#和必须写在文件中的
返回
值
I have to call a win32
dll
functionint func1( int arg1, unsigned char **arg2, int *arg3);and i need wrapped in
c#
aspublic extern int fuc1(int arg1, out IntPtr arg2, out IntPtr arg3);and i called it f...
C#
与C++/Rust交互:
字符串
传递的内存管理与编码实战
在软件开发中,跨语言调用(FFI)是集成不同编程语言优势的常见技术,尤其在需要结合
C#
的快速开发与C++/Rust的高性能时。其核心原理涉及托管与非托管内存模型的差异:托管环境(如.NET)由垃圾回收器自动管理内存,而非托管环境(如C++/Rust)需手动控制分配与
释放
。这种差异在传递
字符串
时尤为关键,因为
字符串
在内存中的表示、编码(如UTF-8、UTF-16)和生命周期管理方式不同。从技术价值看,正确处理跨语言
字符串
能避免内存泄漏、访问违规和乱码问题,提升应用稳定性与性能。典型应用场景包括
C#
桌面应用调用
C#
调用C++
DLL
内存损坏错误排查:P/Invoke、结构体对齐与生命周期管理
在混合编程中,托管代码与非托管代码的交互常涉及内存管理和数据编组等核心概念。P/Invoke机制作为.NET平台调用服务,通过数据编组在托管堆与非托管堆间转换数据,其关键在于确保内存布局、调用约定和生命周期的精确匹配。若参数类型映射错误、结构体对齐不一致或内存所有权不清晰,易引发内存访问违例,导致系统稳定性问题。本文聚焦
C#
调用C++动态链接库时的典型内存损坏错误,结合P/Invoke声明、结构体对齐等热词,深入解析跨语言调用中的常见陷阱与解决方案,适用于高性能计算、硬件驱动集成等需要复用C++模块的场景。
C#
调用C++封装的
dll
返回
字符串
最近在做
C#
调用c++封装的
dll
时,我用的qt封装的,由于编码问题(Windows默认GB2312,qt默认UTF-8),所以用ref string和char*交互时,
返回
的
字符串
经过编码转换后总有一部分汉字转过来还是乱码,后来经过网上查找,测试,发现了两种
返回
字符串
的方法,记录一下。
C#
111,128
社区成员
642,536
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章