C#引用托管對(duì)象概述
學(xué)習(xí)C#語言時(shí),經(jīng)常會(huì)遇到C#引用托管對(duì)象問題,這里將介紹C#引用托管對(duì)象問題的解決方法。
如果在調(diào)用平臺(tái) invoke 后的任何位置都未C#引用托管對(duì)象,則垃圾回收器可能將完成該托管對(duì)象。這將釋放資源并使句柄無效,從而導(dǎo)致平臺(tái)invoke 調(diào)用失敗。用 HandleRef 包裝句柄可保證在平臺(tái)invoke 調(diào)用完成前,不對(duì)托管對(duì)象進(jìn)行垃圾回收。
C#引用托管對(duì)象例如下面:
- FileStream fs = new FileStream( "a.txt", FileMode.Open );
 - StringBuilder buffer = new StringBuilder( 5 );
 - int read = 0;
 - ReadFile(fs.Handle, buffer, 5, out read, 0 );
 - //調(diào)用Win API中的ReadFile函數(shù)
 
由于fs是托管對(duì)象,所以有可能在平臺(tái)調(diào)用還未完成時(shí)候被垃圾回收站回收。將文件流的句柄用HandleRef包裝后,就能避免被垃圾站回收:
- [ DllImport( "Kernel32.dll" )]
 - public static extern bool ReadFile(
 - HandleRef hndRef,
 - StringBuilder buffer,
 - int numberOfBytesToRead,
 - out int numberOfBytesRead,
 - ref Overlapped flag );
 - ......
 - ......
 - FileStream fs = new FileStream( "HandleRef.txt", FileMode.Open );
 - HandleRef hr = new HandleRef( fs, fs.Handle );
 - StringBuilder buffer = new StringBuilder( 5 );
 - int read = 0;
 - // platform invoke will hold reference to HandleRef until call ends
 - ReadFile( hr, buffer, 5, out read, 0 );
 
【編輯推薦】















 
 
 
 
 
 
 