精华内容
下载资源
问答
  • c#marshal
    2020-09-25 14:09:56

    IntPtr ptr = Marshal.AllocHGlobal(704* 576 * 3);

    如果没有手动释放内存,会有内存溢出;

    发生OutOfMemoryException 没有足够的内存继续执行程序时引发的异常。

    调用Marshal.AllocHGlobal必须调用 Marshal.FreeHGlobal(ptr);来手动释放内存,即使调用GC.Collect();方法也无法释放。

    更多相关内容
  • C# Marshal

    千次阅读 2018-10-22 16:34:16
    参见:关于Marshal 类的整理 在两个不同的实体(两个线程或者进程甚至机器、在Managed和Unmanaged之间)进行方法调用和参数传递的时候,具体的调用方法和参数的内存格式可能需要一定的转换,这个转换的过程叫做...

    参见:关于Marshal 类的整理

    在两个不同的实体(两个线程或者进程甚至机器、在Managed和Unmanaged之间)进行方法调用和参数传递的时候,具体的调用方法和参数的内存格式可能需要一定的转换,这个转换的过程叫做Marshal。

    Marshal就是把一个结构(类)序列化成一段内存,然后送到另一个进程(.net中Application domain)中供另一个进程中的函数使用。
    比如你的一个结构

    struct
    {
        Pen pen;
    }s; 

    s是一个指向已有的Pen对象的引用,当你把s传给本进程中的一个函数f时,f可以很容易地找到pen的实际对象,但如果你把s传到另外一个进程时,甚至是另外一台机器上的进程时,这个进程就没办法找到pen的实际内容。Marshal技术则可以把pen对象中的所有实际内容按规则放到一个缓冲中,(所有的引用或指针都要转换成实际对象)然后把缓冲中的内容送到另一个进程,函数调用完成再用同样方式把结果返回来。

    Marshal 类提供了一个方法集,这些方法用于:

    • 分配非托管内存
    • 复制非托管内存块
    • 将托管类型转换为非托管类型
    • 此外还提供了在与非托管代码交互时使用的其他杂项方法

    IntPtr hglobal = Marshal.AllocHGlobal(100); 
    Marshal.FreeHGlobal(hglobal);

    问题:这个100代表什么意思?hglobal又怎样理解?

    100就是100个字节,hglobal是这100个字节的第一个字节的地址,两个方法相当于c里面的malloc, free

    • H = heap 堆   
    • Global = 全局
    • Alloc = Allocate 分配

     

    展开全文
  • C# Marshal类基本概念和入门示例程序

    千次阅读 2021-05-08 05:01:04
    marshal:直译为“编排”, 在计算机中特 指将数据按某种描述格式编排出来,通常来说一般是从非文本...微软对C#Marshal类描述的链接在此; https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopser.

    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.SizeOf和sizeof的区别

    千次阅读 2020-07-18 01:55:33
    今天在C#的程序中导入C++的dll时,发现C++中结构体里的bool类型变量是用的...我们在C#中直接sizeof(bool),得到的是1字节,但是如果我们Marshal.SizeOf(typeof(bool)),获取bool的非托管类型大小得到的就是4个字节。

    今天在C#的程序中导入C++的dll时,发现C++中结构体里的bool类型变量是用的BOOL,在C++头文件中定义的是int为BOOL,占4个字节。C#中相应的结构体里用的却是bool类型,可是bool类型只占一个字节,于是就产生了疑问,为什么这样不会导致结构体所占的字节大小不同呢?

    这是因为我们在封装定义结构体时,是非托管代码。我们在C#中直接sizeof(bool),得到的是1字节,但是如果我们Marshal.SizeOf(typeof(bool)),获取bool的非托管类型大小得到的就是4个字节。

     


    Sizeof在非Unsafe环境下只能用于预定义的一系列类型,如Int,Short等等。而在Unsafe环境下,sizeof可以被用于值类型,但是值类型中不可以有引用类型,否则C#编译器会报错:

    error CS0208: Cannot take the address of, get the size of, or declare a pointer to a managed type ('SizeOf.Program.MyStruct')

    而Marshal.SizeOf则是获得该类型被Marshal(转换,通常翻译为列集,指数据从一种类型转换到另外一种类型)到对应的非托管类型的大小。和sizeof不同,Marshal.SizeOf允许用在含有引用类型的值类型上:
     

    [StructLayout(LayoutKind.Sequential)]
    struct MyStruct
    {
         string s;
    }

    Marshal.SizeOf(MyStruct)结果为4或者8,因为string被Marshal成char*。

    如果我们想指定string或者byte的字节长度,可以使用MarshalAs,MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。

    [StructLayout(LayoutKind.Sequential)]
    struct MyStruct
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]      // 指定string的长度用ByValTStr
        string s;
    
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]     // 指定byte数组的长度用ByValArray
        byte []x;
    }
    

    如果用在不含有引用类型的值类型上,其结果也有可能和sizeof完全不一样,如对于下面的值类型:

    [StructLayout(LayoutKind.Sequential)]
    struct MyStruct
    {
         char b;
    }

    sizeof(MyStruct)为2,而Marshal.SizeOf(typeof(MyStruct))结果则为1。这是因为在.NET中char总是Unicode,而缺省情况下char会被Marshal成8位的Ansi字符,因此结果不同。

    反之,如果我们指定这个char被Marshal成short值(也就是UTF16),如下:
     

    [StructLayout(LayoutKind.Sequential)]
    struct MyStruct
    {
         [MarshalAs(UnmanagedType.I2)]
         char b;
    }

    那么sizeof和Marshal.SizeOf结果均为2。MarshalAs这个Attribute可以影响Marshal.SizeOf的结果,而不能影响sizeof的结果。

    一个有意思的情况是,如果值类型不含任何成员,如下:

    [StructLayout(LayoutKind.Sequential)]
    struct MyStruct
    {
    }

    Sizeof和Marshal.SizeOf结果均为1,而不是0。这个结果和C++的结果是一致的。原因很简单:如果声明一个这样的数组,如果元素大小为0的话,那么每个元素都具有相同的地址,这是不为C++标准所允许的,和正常的非0的情况也不一致。.NET在这里采用和c++相同的规则,也认为空的值类型大小为1。

    最后需要注意的是,如果MyStruct是模板:

    [StructLayout(LayoutKind.Sequential)]
    struct MyStruct
    {
        T a
    }

    如果对Marshal.SizeOf传入MyStruct<>或者MyStruct这样的类型,则抛出ArgumentException,因为Marshal.SizeOf完全不支持泛型。

    同样的,sizeof也不支持模板类型,而且连MyStruct这样子的类型也不支持。C#编译器会对sizeof(MyStruct)报错:error CS0208: Cannot take the address of, get the size of, or declare a pointer to a managed type ('SizeOf.Program.MyStruct')
     

    展开全文
  • c# Marshal使用

    千次阅读 2017-04-27 10:07:56
    int nSizeOfPerson = Marshal.SizeOf(person); IntPtr intPtr = Marshal.AllocHGlobal(nSizeOfPerson); // 通过函数对intPtr的地址空间写入数据 ...............//将数据从托管对象封送到非托管内存块,该内存块开始...
  • C# Marshal.Copy实现非托管指针和数组之间的转换 挑战 VectorFileIO套件里面 读写文件是 IntPtr类型的指针操作。 原始数据是Int32数组(Int[采样点,通道]),要写入文件。读出文件要转换成反映的物理变量是采集的...
  • IntPtr ptr = Marshal.AllocHGlobal(704* 576 * 3); 如果没有手动释放内存,会有内存溢出; 发生OutOfMemoryException 没有足够的内存继续执行程序时引发的异常。 调用Marshal.AllocHGlobal必须调用 Marshal....
  • 1、Marshal.GetActiveObject 函数会抛出异常MK_E_UNAVAILABLE;可能是用户权限不同,将两个程序都用管理员启动即可; 2、如何查看程序的ProgID:注册表查看:HKEY_CLASSES_ROOT\ProgID\CLSID
  • c++ convert c# 代码转换工具,单个头文件进行c#转换 无法计算有意义的大小或偏移量 UnmanagedType.ByValArray 自定义类型,使用struct
  • C# Marshal.SizeOf

    2016-08-11 14:21:32
    但是要知道此类的字段字节总数,使用Marshal.SizeOf,无疑是一个非常好的选择.这样可以大大节省你计算字节数的时间.使用方法:Marshal.SizeOf( packet实例 )usingSystem; usingSystem.Runtime.InteropServices; ...
  • 结构内的string类型未给定长  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string str;
  • public GxBitmap(IGXDevice objIGXDevice, PictureBox ...Marshal.AllocHGlobal之后需要自己释放内存,因为非托管内存属于C#GC范畴之外的数据,GC无法完成自动回收,可以Marshal.FreeHGlobal( ptr );避免溢出
  • Marshal类的PtrToStructure

    2021-01-08 02:48:58
    PtrToStructure,将数据从非托管内存块封送到新分配的指定类型的托管对象 应用:MFC发送消息到WPF界面上 public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) ...
  • 主要是使用Marshal类里的两个方法: 第一个是StructureToPtr,将数据从托管对象封送到非托管内存块。 第二个是PtrToStructure,将数据从非托管内存块封送到新分配的指定类型的托管对象。 只要有了这两个相互转换...
  • C#指针操作Marshal实例

    2021-04-29 17:33:19
    static void Main(string[] args) { byte[] a = new byte[]{0,0,0,0}; byte[] b = new byte[] {1,... IntPtr pt = Marshal.AllocHGlobal(a.Length); //从source数组的startIndex下标开始复制length个对象到ptr; ...
  • 这是由于结构体在内存中...以下为官方说明 /注意:如果C++回传结构体到C#中,最好也设置下字节对齐方式 使用伪指令#pragma pack(n):C编译器将按照n个字节对齐; 使用伪指令#pragma pack(): 取消自定义字节对齐方式。
  • C# Marshal学习记录,实战相机开发

    千次阅读 2018-08-21 15:55:45
    可见,Marshal主要是用来操作非托管内存的。此类中定义的大多数方法是提供给开发人员的托管和非托管编程模型之间的桥梁。例如, StringToHGlobalAnsi 方法将ANSI字符从指定的字符串(在托管堆中)复制到非托管堆中...
  • 以下异常:Marshal.PtrToStructure(StructPtr, typeof(T));  原因: 在实际使用中 T 没有一个 parameterless constructor 于是加一个: private RepoTick() { } 解决问题
  • C#——Marshal

    千次阅读 2019-01-04 19:18:26
    参考文档...  Marshal类的功能:将数据从托管对象封送到非托管内存块 int personSize = Marshal.SizeOf( typeof(Person) ); IntPtr intPer = Marshal.AllocHGlobal( personSize );//将...
  • 使用 Marshal 做出可以快速释放内存的大数组。 需要不断申请一段大内存数组,然后就释放他,但是 C# 对于大内存不是立刻释放,所以就存在一定的性能问题。 在博客园看到了一位大神使用 Marshal 做出快速申请的大数...
  • C# - Marshal 学习总结

    万次阅读 2017-04-11 18:39:38
    C#——Marshal.StructureToPtr方法简介 http://blog.csdn.net/livelylittlefish/article/details/2423764   具体可以参考http://msdn.microsoft.com。
  • ``` C# [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] class C1 { public byte a = 0; public byte b = 0; public byte c = 0; } [StructLayout(LayoutKind.Sequential...
  • Marshal 类的内存操作的一般功能 Marshal类 提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。 命名空间:...
  • 2、Key:是一个十六进制的内存地址,在C#程序中由 IntPtr 类型进行存储,在32位的程序中最大可指向为2GB; 3、Value:是一个8位长度的二进制数,最大值可转换成十进制的255,或可理解为1byte的数据; 4、组成结构...
  • 前言 用到PtrToStructure进行指针转结构体,结果一直报如下错误: NullReferenceException: Object reference not set to an instance of an object (wrapper unknown) **....(TYPE)Marshal.PtrToStructure((IntPtr
  • Marshal类的使用

    2014-04-17 23:13:26
    Marshal类的简单使用,博客:http://blog.csdn.net/dingxiaowei2013/article/details/23934693
  • C#中的Marshal

    2015-09-30 10:55:00
    fDeleteOld:true to call the Marshal.DestroyStructure method on the ptr parameter before this method copies the data. // The block must contain valid data. // Note that passing false when the ...
  • Marshal 类 命名空间:System.Runtime.InteropServices 提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项...
  • C# P/Invoke中传递数组参数 C#在调用动态库接口,有时需要在C#中分配非托管内存,以便动态库可以写入返回的数据;有时我们需要传递一个复杂的数组等等。在C++的方法原型中,是一个*即指针,在C#的方法原型,相对应...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,106
精华内容 6,042
关键字:

c#marshal

c# 订阅