新聞中心
C#中調(diào)用Windows API之托管對(duì)象是如何的呢?讓我們來(lái)看看:

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的寶應(yīng)網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
C#中調(diào)用Windows API如果在調(diào)用平臺(tái) invoke 后的任何位置都未引用托管對(duì)象,則垃圾回收器可能將完成該托管對(duì)象。這將釋放資源并使句柄無(wú)效,從而導(dǎo)致平臺(tái)invoke 調(diào)用失敗。用 HandleRef 包裝句柄可保證在平臺(tái) invoke 調(diào)用完成前,不對(duì)托管對(duì)象進(jìn)行垃圾回收。
C#中調(diào)用Windows API實(shí)例下面:
- 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 );
C#中調(diào)用Windows API之如何保證使用托管對(duì)象的平臺(tái)調(diào)用成功的相關(guān)內(nèi)容就向你介紹到這里,希望對(duì)你了解C#中調(diào)用Windows API有所幫助。
本文標(biāo)題:C#中調(diào)用WindowsAPI之托管對(duì)象
網(wǎng)頁(yè)路徑:http://www.5511xx.com/article/dhsiide.html


咨詢(xún)
建站咨詢(xún)
