M a r s h a l 类 的 使 用 Marshal类的使用 Marshal类的使用
https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.marshal?redirectedfrom=MSDN&view=netframework-4.7.2
Marshal就是把一个结构(类)序列化成一段内存,然后送到另一个进程(.net中Application domain)中供另一个进程中的函数使用。
C#中IntPtr类型
用于表示指针或句柄的平台特定类型。
C#中的IntPtr类型被称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄。
C# 中托管和非托管的区别
托管资源指bai的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。
非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网络连接,数据库连接,画刷,图标等。这类资源,垃圾回收器在清理的时候会调用Object.Finalize()方法。默认情况下,方法是空的,对于非托管对象,需要在此方法中编写回收非托管资源的代码,以便垃圾回收器正确回收资源。
Marshal.AllocHGlobal
1.AllocHGlobal(Int32)
通过使用指定的字节数,从进程的非托管内存中分配内存。
2.AllocHGlobal(IntPtr)
通过使用指向指定字节数的指针,从进程的非托管内存中分配内存。
IntPtr img = (IntPtr) pics[ i ];
byte[] data = new byte[picLength];
Marshal.Copy(img, data, 0, data.length);
using(MemoryStream ms = new MemoryStream(data))
{
imgbox = Image.FromSteam(ms);
}
stSaveParam.nHeight = m_stFrameInfo.nHeight;
stSaveParam.nWidth = m_stFrameInfo.nWidth;