C#引用托管对象概述

学习C#语言时,经常会遇到C#引用托管对象问题,这里将介绍C#引用托管对象问题的解决方法。

如果在调用平台 invoke 后的任何位置都未C#引用托管对象,则垃圾回收器可能将完成该托管对象。这将释放资源并使句柄无效,从而导致平台invoke 调用失败。用 HandleRef 包装句柄可保证在平台invoke 调用完成前,不对托管对象进行垃圾回收。

C#引用托管对象例如下面:

 
 
 
  1. FileStream fs = new FileStream( "a.txt", FileMode.Open );
  2. StringBuilder buffer = new StringBuilder( 5 );
  3. int read = 0;
  4. ReadFile(fs.Handle, buffer, 5, out read, 0 ); 
  5. //调用Win API中的ReadFile函数

由于fs是托管对象,所以有可能在平台调用还未完成时候被垃圾回收站回收。将文件流的句柄用HandleRef包装后,就能避免被垃圾站回收:

 
 
 
  1. [ DllImport( "Kernel32.dll" )]
  2. public static extern bool ReadFile(
  3. HandleRef hndRef,
  4. StringBuilder buffer,
  5. int numberOfBytesToRead,
  6. out int numberOfBytesRead,
  7. ref Overlapped flag );
  8. ......
  9. ......
  10. FileStream fs = new FileStream( "HandleRef.txt", FileMode.Open );
  11. HandleRef hr = new HandleRef( fs, fs.Handle );
  12. StringBuilder buffer = new StringBuilder( 5 );
  13. int read = 0;
  14. // platform invoke will hold reference to HandleRef until call ends
  15. ReadFile( hr, buffer, 5, out read, 0 );

分享名称:C#引用托管对象概述
标题来源:http://www.shufengxianlan.com/qtweb/news19/376419.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联