En C#, IntPtr explicado en detalle

在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();
    }
}

En el ejemplo anterior, usamos la clase Process para iniciar la aplicación Calculadora de Windows y usamos IntPtr para obtener su identificador de ventana principal. Usamos la propiedad MainWindowHandle para obtener el identificador de la ventana principal. En este caso, solo enviamos el identificador a la consola, pero puede usarlo para interactuar con la aplicación de otras maneras. Usando las clases IntPtr y ProcessStartInfo, podemos iniciar convenientemente otras aplicaciones en una aplicación C# e interactuar con ellas de varias maneras.
Aquí hay un ejemplo simple que usa las clases IntPtr y Marshal para acceder a datos en código no administrado:

tu

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();
    }
}

En el ejemplo anterior, primero creamos una matriz de enteros. Luego, usamos el método Marshal.AllocHGlobal para solicitar un espacio de memoria y usamos el método Marshal.Copy para copiar el contenido de la matriz de enteros en el espacio de memoria. Luego recorremos los datos en la memoria, usamos el método IntPtr.Add para obtener el desplazamiento y luego usamos el método Marshal.ReadInt32 para leer los datos enteros en la memoria y enviarlos a la consola. Finalmente, usamos el método Marshal.FreeHGlobal para liberar espacio en la memoria y limpiar los recursos.

Usando las clases IntPtr y Marshal, podemos acceder fácilmente a código no administrado en aplicaciones de C# e interactuar leyendo y escribiendo datos de memoria. Al mismo tiempo, debemos tener mucho cuidado para garantizar que no se produzcan violaciones de acceso y otros problemas de seguridad al manipular la memoria.

Supongo que te gusta

Origin blog.csdn.net/shanniuliqingming/article/details/129311020
Recomendado
Clasificación