在C#中,IntPtr是一个结构,表示一个指针或处理器的本机大小的有符号整数。 它可以用来保存一个内存地址,也可以使用它访问非托管代码,如Win32 API。 IntPtr类型在跨平台开发中很有用,因为它的大小会根据运行时平台的特定实现而有所不同。在C#中,使用IntPtr可以使跨平台开发更加方便。 它可以在32位和64位系统之间无缝切换,而无需更改源代码。IntPtr类型还避免了使用指针类型时可能出现的不安全问题和不兼容问题,在访问非托管代码时非常有用。在使用IntPtr时,可以将其声明为变量,将其分配给指针或将其用作函数调用的参数。 若要访问指针所指向的数据,可以使用Marshal类中的各种方法,例如Marshal.ReadByte、Marshal.ReadInt32等。 通过使用IntPtr和Marshal类,可以在C#应用程序中方便地访问非托管代码。
using System;
using System.Diagnostics; //需要引入 System.Diagnostics 命名空间class Program
{static void Main(string[] args){ProcessStartInfo startInfo = new ProcessStartInfo("calc.exe");Process process = new Process();process.StartInfo = startInfo;process.Start();process.WaitForInputIdle();//使用IntPtr获取应用程序的主窗口句柄,以便进行进一步的操作IntPtr hwnd = process.MainWindowHandle;Console.WriteLine("Window Handle: {0}", hwnd.ToString("X8"));Console.ReadLine();}
}

在上述示例中,我们使用Process类启动Windows计算器应用程序,并使用IntPtr获取其主窗口句柄。 我们使用MainWindowHandle属性获取主窗口句柄。在这种情况下,我们只是将句柄输出到控制台,但您可以使用它以其他方式与该应用程序交互。 使用IntPtr和ProcessStartInfo类,我们可以在C#应用程序中方便地启动其他应用程序并以各种方式与其交互。
下面是一个简单的例子,使用IntPtr和Marshal类访问非托管代码中的数据:

u

sing System;
using System.Runtime.InteropServices; //需要引入System.Runtime.InteropServices命名空间class Program
{static void Main(string[] args){int[] intArray = { 1, 2, 3, 4, 5 }; //创建一个整数数组IntPtr intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(intArray[0]) * intArray.Length); //申请一块内存空间Marshal.Copy(intArray, 0, intPtr, intArray.Length); //将intArray数组中的内容复制到内存空间中for (int i = 0; i < intArray.Length; i++){int number = Marshal.ReadInt32(IntPtr.Add(intPtr, i * Marshal.SizeOf(intArray[0]))); //使用IntPtr和Marshal读取内存中的整数数据Console.WriteLine(number);}Marshal.FreeHGlobal(intPtr); //释放内存空间Console.ReadLine();}
}

在上述示例中,我们首先创建一个整数数组。然后,我们使用Marshal.AllocHGlobal方法申请一块内存空间,并使用Marshal.Copy方法将整数数组中的内容复制到内存空间中。我们然后循环遍历内存中的数据,使用IntPtr.Add方法获取偏移量,然后使用Marshal.ReadInt32方法读取内存中的整数数据,并将其输出到控制台。 最后,我们使用Marshal.FreeHGlobal方法释放内存空间并清理资源。

使用IntPtr和Marshal类,我们可以方便地在C#应用程序中访问非托管代码,并通过读取和写入内存数据进行交互。 同时,我们需要非常小心,以确保在操作内存时不会引起访问越界和其他安全问题。

C#中,IntPtr详解相关推荐

  1. 函数中{}输出格式详解(C#)

    Console.WriteLine()函数中{}输出格式详解(C#) Console.WriteLine()函数的格式一直没怎么注意.今天同事问起Console.WriteLine({0:D3},a) ...

  2. Java中CAS详解

    转载自  Java中CAS详解 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换 ...

  3. 【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵

    转自:图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵_sherlockreal的博客-CSDN博客_视角矩阵 图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵 图形流水线中坐标变换过程 ...

  4. oracle itl解析,oracle数据块dump文件中ITL详解

    oracle数据块dump文件中ITL详解 dump出Oracle block后,可以看到事物槽,包含有事物槽号(ITL),XID,UBA,FLAG,LCK,SCN. 本文主要讨论FLAG标记的规则, ...

  5. android中getSystemService详解

    原文地址:android中getSystemService详解作者:邹斌 http://blog.sina.com.cn/s/blog_71d1e4fc0100o8qr.html http://blo ...

  6. Oracle中CONCAT详解

    Oracle中CONCAT详解 1.什么是CONCAT 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写 ...

  7. Java中LinkedList详解

    Java中LinkedList详解 LinkedList底层是双向链表 单向链表 双向链表 LinkedList新增的方法 主要增加了针对头结点与尾结点进行操作的方法, 即针对第一个元素和最后一个元素 ...

  8. vue 生命周期的11中方法详解

    vue 生命周期的十一中方法详解 vue 生命周期的定义 vue实例 从创建到销毁,也就是说从创建 -> 初始化 数据-> 编译模版 -> 挂载Dom -> 渲染 更新 -&g ...

  9. oracle语句中dual什么意思,oracle中dual详解

    oracle中dual详解 基本上oracle引入dual为的就是符合语法 1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的. 2. ...

  10. 24.shell中list详解,定义list,获取List的总个数,获取list的某个元素值,将list的每个元素转换成以空格分隔的字符串,空格分隔的字符串转换成list,for循环list

    文章目录 前言 定义list 获取List的总个数 获取list的某个元素值 将list的每个元素转换成以空格分隔的字符串 空格分隔的字符串转换成list for循环list 总结 友情链接 前言 s ...

最新文章

  1. 【 全干货 】5 分钟带你看懂 Docker !
  2. Kali-Linux虚拟机安装提示
  3. Java 并发编程系列之带你了解多线程
  4. 不用一行代码,用 API 操作数据库,你信吗
  5. 10. 考点概览和摘要
  6. [置顶] UDP协议---心德(1)
  7. 6.dubbo常用的xml配置有哪些_【面试篇】必须掌握的Spring 常用注解
  8. 【TI-ONE系列教程(四)】如何使用 TI-ONE Notebook 玩转算法大赛
  9. k8s-kubectl进程源码分析
  10. 《啊哈!算法》-----系列更新暂时停止
  11. 【redis】spring boot利用redis的Keyspace Notifications实现消息通知
  12. setuna截图怎么放大缩小_手机中的望远镜 华为P30pro是怎么做到50倍变焦?
  13. Ubuntu20.04如何解决QQ闪退问题(亲测有效)
  14. Oracle Coherence中文教程四:构建一个Coherence 应用
  15. 2018年南京公积金贷款新政答疑来了!首套房最高可贷50万元/人(附首套房认定标准)...
  16. 图表控件AnyChart使用JavaScript创建维恩图
  17. 用html制作问卷调查
  18. 华为IT“智”存高远,普“慧”于民
  19. C语言中字符串和字符数组的区别
  20. 找数据不求人,轻松获取你想要的数据!

热门文章

  1. R语言安装包,安装Github包的三种方法
  2. vos 3000 话单分析
  3. 用 Python 画动态时钟
  4. Windows7 Update 无法更新补丁解决方法,IE11浏览器也可以通过更新系统自动安装
  5. 工业级数据分发服务DDS之安全篇
  6. 微课堂V2 v4.6.5
  7. UE4 C++:Delegate委托
  8. MySQL索引创建语法
  9. 废品机械师双脚机器人教程_废品机械师自动机器人制作方法_快吧单机游戏
  10. tomcat9设置编码