C#中调用Windows API之托管对象

网友投稿 284 2023-05-29

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函数  1.2.3.4.5.6.

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

复制[ DllImport( "Kernel32.dll" )]   publicstaticexternbool ReadFile(    HandleRef hndRef,    StringBuilder buffer,    int numberOfBytesToRead,    outint 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 );   1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.

C#中调用Windows API之如何保证使用托管对象的平台调用成功的相关内容就向你介绍到这里,希望对你了解C#中调用Windows API有所帮助。

【编辑推荐】

C# Windows CE特点之兼容性 C# Windows CE特点之可连接性 C# Windows CE特点之实时性 C#调用Windows API之调用格式浅析 C#调用Windows API之参数类型浅析

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:APISpace 绕口令API接口 免费好用
下一篇:REST API认证的四种常用方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~