C#Marshal类基本概念和入门实例讲解 |
您所在的位置:网站首页 › processing基础代码 › C#Marshal类基本概念和入门实例讲解 |
C#Marshal类基本概念和入门实例讲解
C# Marshal类基本概念及入门 marshal:直译为“编排”, 在计算机中特 指将数据按某种描述格式编排出来,通常来说一般是从非文本格式到文本格式的数据转化。unmarshal是指marshal的逆过程。比如在WebService中,我们需要把java对象以xml方式表示并在网络间传输,把java对象转化成xml片段的过程就是marshal. 微软对C#中Marshal类描述的链接在此; https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal?view=net-5.0 Provides a collection of methods for allocating unmanaged memory, copying unmanaged memory blocks, and converting managed to unmanaged types, as well as other miscellaneous methods used when interacting with unmanaged code. 提供一个方法集合,分配非托管内存,拷贝非托管内存块,转换托管和非托管类型,以及一些和非托管代码交互的杂类方法; 这是Marshal类的基本功能;.net一共包含四个Marshal类,每个都有一些方法; 下面来看一个Marshal类基本程序;程序运行结果如下; 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace marshalDemo1 { public struct Point { public Int32 x, y; } public partial class Form1 : Form { [DllImport("Kernel32", ExactSpelling = true, SetLastError = true)] static extern Boolean CloseHandle(IntPtr h); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { textBox1.Text = Marshal.SystemDefaultCharSize.ToString(); textBox2.Text = Marshal.SystemMaxDBCSCharSize.ToString(); textBox3.Text = Marshal.SizeOf(typeof(Point)).ToString(); Point p = new Point(); textBox4.Text = Marshal.SizeOf(p).ToString(); IntPtr hglobal = Marshal.AllocHGlobal(100); textBox5.Text = hglobal.ToString(); Marshal.FreeHGlobal(hglobal); Boolean f = CloseHandle(new IntPtr(-1)); if (!f) { Console.WriteLine("CloseHandle call failed with an error code of: {0}", Marshal.GetLastWin32Error()); } } } }C# Marshal.Copy实现非托管指针和数组之间的转换 挑战 VectorFileIO套件里面 读写文件是 IntPtr类型的指针操作。 原始数据是Int32数组(Int[采样点,通道]),要写入文件。 读出文件要转换成反映的物理变量是采集的double波形 (double[通道,采样点])。 写文件 //初始化缓存指针对应的非托管内存 IntPtr IntPtr变量 = Marshal.AllocHGlobal(缓存Byte长度); 采集循环 { //讲采集得到的Int一维数组拷贝到缓存 Marshal.Copy(采集一维数组, 0, IntPtr变量, 数组sample长度); //将缓存写入矢量文件 vectorFile.Write(IntPtr变量, 缓存Byte长度); } //释放缓存 Marshal.FreeHGlobal(IntPtr变量); //关闭文件 vectorFile.Close(); 读文件 //初始化缓存指针对应的非托管内存 IntPtr IntPtr变量 = Marshal.AllocHGlobal(缓存Byte长度); 读文件循环 { //矢量文件读入缓存 vectorFile.read(IntPtr变量, 缓存Byte长度); //缓存拷贝入一维数组, 数组长度=缓存Byte长度 /4 (因为4 bytes per int32) Marshal.Copy(IntPtr变量, 一维数组, 0, 数组sample长度); //由Int32 一维数组 转换为2维 double数组使用 } //释放缓存 Marshal.FreeHGlobal(IntPtr变量); //关闭文件 vectorFile.Close();总结 以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程宝库。 下一节:聚星C#数字信号处理工具包频谱分析的用法C# 教程聚星C#数字信号处理工具包频谱分析JXI C# DSP Tools, Spectrum Analysis聚星针对C#平台开发了数字信号处理工具包。 这里讲解频谱分析用法:引用SeeSha ... |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |