十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
C#中调用Windows API之托管对象是如何的呢?让我们来看看:

创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站制作、成都外贸网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的宝应网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
C#中调用Windows API如果在调用平台 invoke 后的任何位置都未引用托管对象,则垃圾回收器可能将完成该托管对象。这将释放资源并使句柄无效,从而导致平台invoke 调用失败。用 HandleRef 包装句柄可保证在平台 invoke 调用完成前,不对托管对象进行垃圾回收。
C#中调用Windows API实例下面:
- FileStream fs = new FileStream(
 - "a.txt", FileMode.Open );
 - StringBuilder buffer = new StringBuilder( 5 );
 - int read = 0;
 - ReadFile(fs.Handle, buffer, 5, out read, 0 );
 - //调用Win API中的ReadFile函数
 
由于fs是托管对象,所以有可能在平台调用还未完成时候被垃圾回收站回收。将文件流的句柄用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#中调用Windows API之如何保证使用托管对象的平台调用成功的相关内容就向你介绍到这里,希望对你了解C#中调用Windows API有所帮助。