首页 > 其他分享 >托管与非托管转换-Marshal 类

托管与非托管转换-Marshal 类

时间:2023-04-12 09:57:27浏览次数:36  
标签:Console 与非 托管 内存 数组 managedArray Marshal

Marshal是一个方法集合,主要应用在C#和非托管代码交互时,主要有如下方法:

  • 分配非托管内存

  • 复制非托管内存块

  • 将托管类型转换为非托管类型

  • 其他方法(与非托管代码交互时)

  • 常用方法


IntPtr ptr = xxxx;
Data data = new Data();
object obj = data;
ptr ====> data
Marshal.PtrToStructure(ptr, obj);
Marshal.PtrToStructure(ptr, data);
object ret = (Data)Marshal.PtrToStructure(ptr, data.GetType());
Data ret = Marshal.PtrToStructure(ptr);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace ConsoleApp2
{
    class Program
    {
       //数组写到非托管内存并读回到托管内存
        static void Main(string[] args)
        {
            //1.创建一个托管内存
            Int64[] managedArray = { 1, 2, 3, 4, };
            int size = Marshal.SizeOf(managedArray[0]) * managedArray.Length;
            //初始化非托管内存以保存数组 pnt 指向非托管内存块的指针
            IntPtr pnt = Marshal.AllocHGlobal(size);
            try
            {
                //把一个数组拷贝到非托管内存中
                Marshal.Copy(managedArray, 0, pnt, managedArray.Length); //重载方法 托管数组拷贝到非拖过数组中
                //拷贝一个非托管数组到另一个托管数组中 
                Int64[] managedArray2 = new Int64[managedArray.Length];
                Marshal.Copy(pnt, managedArray2, 0, managedArray.Length);  //重载方法 非托管数组拷贝到托管数组managedArray2 中
                Console.WriteLine("这个数组被拷贝到一个非托管数组中");
                Console.WriteLine("----");
                Console.WriteLine("The array of unmanaged memory");
                //因为 一个int64 占用8个字节,所以下边的偏移量为 i*8
                for (int i = 0; i < managedArray.Length; i++)
                {
                    Console.Write(Marshal.ReadInt64(pnt, i * 8) + " ");
                }
                Console.Write("\r\n");
                Console.WriteLine("---");
                Console.WriteLine("The back array of unmanaged memory");
                for (int i = 0; i < managedArray.Length; i++)
                {
                    Console.Write(managedArray2[i] + " ");
                }
                Console.Write("\r\n");
                Console.ReadKey();

            }
            finally {
                Marshal.FreeHGlobal(pnt);
            }

        }
    }
}

标签:Console,与非,托管,内存,数组,managedArray,Marshal
From: https://www.cnblogs.com/sundh1981/p/17308761.html

相关文章

  • .NET与非托管代码交互操作 — IntPtr
    在.NET中,IntPtr是一个结构体,封装于mscorlib.dll程序集,表示一个指针或句柄类型的整数值。它的作用类似于C/C++中的void*指针类型,可以存储指向任意数据类型的内存地址,定义如下图IntPtr通常用于与非托管代码进行交互,比如调用Win32API函数,由于非托管代码使用指针或句柄来访问内存......
  • C++/CLI 托管C++的数组介绍【4】
    Git源码地址 C++/CLI托管C++的托管与非托管字符串的相互转换【1】C++/CLI托管C++的数据类型介绍【2】C++/CLI托管C++的基本数据类型及函数【3】C++/CLI托管C++的数组介绍【4】C++/CLI托管C++之字符串封装【5】C++/CLI托管C++之enum枚举封装【6】C++/CLI托管C++之类、属性......
  • 笔记十五:gitlab-自建代码托管平台
    一:学习内容gitlab简介gitlab安装说明gitlab登录gitlab创建远程库idea集成gitlab 二:gitlab简介GitLab是由GitLabInc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。gitlab官方网址:htt......
  • 笔记十三:gitee-国内代码托管中心码云
    一:学习内容gitee码云简介gitee码云注册登录gitee码云删除远程库gitee码云创建远程库idea集成gitee码云gitee码云中导入github项目 二:gitee码云简介github服务器在国外,使用它作为项目托管网站,很多时候网速不好,严重影响体验,甚至会出现打开不了的情况。针对这个情况,我们......
  • Java Checked Exception 的是与非
    结论JavaCheckedException是一个设计错误,初衷很美好,现实很糟糕。设计的初衷把方法可能抛出的异常,显示地声明在方法定义中,比如FileInputStream的构造函数可能会抛出FileNotFoundException:publicFileInputStream(Stringname)throwsFileNotFoundException{this(name......
  • 关于 阻塞与非阻塞 , 同步与异步的 知识。
    网上讲的非常好的文章。                   ......
  • 关于aws-s3-bucket-静态网站托管相关的查询-S3.Client.get_bucket_website(**kwargs)
    关于aws-s3-bucket-静态网站托管相关的查询,这里笔者主要整理一下基于AWSSDKforPython(Boto3)方式,相关的判断和逻辑1、首先是判断s3-bucket有没有开启静态网站托管,即页......
  • Qt5.12实战之模态与非模态对话框使用
    模态对话框使用创建对话框资源创建成功后工程中会出对话框的h及cpp文件和.ui文件双击打开UI文件,向设计窗口中拖入按钮控件并选择栅格布局创建模态对话框并显......
  • 使用 Windows Debugger 调试托管代码
    使用WindowsDebugger调试托管代码 使用WindowsDebugger调试托管代码https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugging-manage......
  • 使用Github和Bitbucket托管项目 Git的全局配置和单个项目的配置
    Git是Linus.Torvald为了管理Linux内核发起并开发的一个开源分布式版本控件系统(DVCS)。从2002年起,Linux内核一直使用BitKeeper来进行版本管理,但是在2005年BitKeeper和Linux......