C#引用托管对象概述

开发 后端
这里介绍C#引用托管对象,如果在调用平台 invoke 后的任何位置都未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 ); 

【编辑推荐】

  1. C# this关键字详解
  2. C#调用析构方法详解
  3. C#释放托管资源简单描述
  4. C#单路代理简单分析
  5. C#文法产生式概述
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-31 09:44:23

C# Employee

2009-08-25 10:08:39

C# MyData对象

2009-08-10 13:40:46

创建C# COM对象

2009-08-17 13:49:20

C#中调用Window

2009-08-19 10:25:18

C#托管资源

2009-09-03 11:15:38

C#设置Coopera

2009-07-31 14:08:54

C# 匿名函数

2009-08-18 17:29:02

C#使用指针

2009-08-13 15:18:23

C#文件上传

2009-08-18 09:26:07

C#线程功能

2009-08-20 16:28:45

C#匿名方法

2009-08-25 16:49:44

C#使用if语句

2009-08-24 18:09:13

C#构造函数

2009-08-17 09:57:00

C# Windows

2009-09-03 10:42:16

C# Employee

2009-08-19 11:09:00

C# Cast<T>

2009-08-14 17:09:48

C#引用类型

2009-09-02 10:39:00

C#释放托管资源

2009-09-02 09:13:16

C#文法产生式

2009-08-03 18:26:18

C#定义接口成员
点赞
收藏

51CTO技术栈公众号