<tbody id="86a2i"></tbody>


<dd id="86a2i"></dd>
<progress id="86a2i"><track id="86a2i"></track></progress>

<dd id="86a2i"></dd>
<em id="86a2i"><ruby id="86a2i"><u id="86a2i"></u></ruby></em>

    <dd id="86a2i"></dd>

    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類基本程序;程序運行結果如下;

    C#?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();

    總結

    以上為個人經驗,希望能給大家一個參考,也希望大家多多支持。

    原文地址:https://blog.csdn.net/bcbobo21cn/article/details/116512451

    相關文章:

    免费一级a片在线播放视频|亚洲娇小性XXXX色|曰本无码毛片道毛片视频清|亚洲一级a片视频免费观看
    <tbody id="86a2i"></tbody>

    
    
    <dd id="86a2i"></dd>
    <progress id="86a2i"><track id="86a2i"></track></progress>

    <dd id="86a2i"></dd>
    <em id="86a2i"><ruby id="86a2i"><u id="86a2i"></u></ruby></em>

      <dd id="86a2i"></dd>