利用C#Marshal类实现托管和非托管的相互转换

Marshal 类 

命名空间:System.Runtime.InteropServices 

提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。 Marshal 类中定义的 static 方法对于处理非托管代码至关重要。此类中定义的大多数方法通常由需要在托管和非托管编程模型之间提供桥梁的开发人员使用。例如,StringToHGlobalAnsi 方法将 ANSI 字符从指定的字符串(在托管堆中)复制到非托管堆中的缓冲区。该方法还分配大小正确的目标堆。 

struct和IntPtr的相互转换: 

tagCaptureFrame f = (tagCaptureFrame)Marshal.PtrToStructure (m.WParam, typeof(tagCaptureFrame)); 

struct和byte[]相互转换(用Marshal类实现) 

转载自:http://www.cnblogs.com/tuyile006/archive/2006/12/28/605962.html 

相当于序列化与反序列化,但是不用借助外部文件

1、struct转换为byte[]
static byte[] StructToBytes(object structObj)
{
int size = Marshal.SizeOf(structObj);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structObj, buffer, false);
byte[] bytes = new byte[size];
Marshal.Copy(buffer, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(buffer);
} 

}
   2、byte[]转换为struct
static object BytesToStruct(byte[] bytes, Type strcutType)
{
int size = Marshal.SizeOf(strcutType);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, buffer, size);
return Marshal.PtrToStructure(buffer, strcutType);
}
finally
{
Marshal.FreeHGlobal(buffer);
}
} 
时间: 2024-10-30 08:43:04

利用C#Marshal类实现托管和非托管的相互转换的相关文章

C# 托管和非托管混合编程

在非托管模块中实现你比较重要的算法,然后通过 CLR 的平台互操作,来使托管代码调用它,这样程序仍然能够正常工作,但对非托管的本地代码进行反编译,就很困难. 最直接的实现托管与非托管编程的方法就是使用C++/CLI 介绍 项目存档一直是企业的采用的做法,而是事实证明他们也是对的!对于一个程序员,这是几千men-days的工作量.为什么不开发一小段代码去重新利用那段代码,项目. 现在提供了一个渐渐的转向C#的新技术: 使用托管与非托管的混合编程.这是一个可行的方案在top-down issue(f

托管和非托管转换新方法:Marshaling Library(zz) 【转】

托管和非托管转换新方法:Marshaling Library(zz) 托管和非托管转换新方法:Marshaling Library(zz) http://hi.baidu.com/superql/blog/item/38e9c8073202fcc37a8947ac.html 1.VC++2008中新增加的库:Marshaling Library 我们一起讨论一下VC++2008中引入的新库——Marshaling Library.在这个类库之前我们使用的传统方法是固定指针(pin_ptr).要使

关于托管与非托管

关于托管与非托管 到底什么是托管,什么是非托管的研究 前言 最近在看<ASP.NET MVC 4框架揭秘>,里面有很多微软.net的东西,其中就很多次提到了托管与非托管,搞得我云里雾里的,今天特地抽空来整理一下.大部分内容都是参考别人的. 托管代码 托管代码就是Visual Basic .NET和C#编译器编译出来的代码.编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码.中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性

.NET的堆和栈04,对托管和非托管资源的垃圾回收以及内存分配

在" .NET的堆和栈01,基本概念.值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配.我们知道:当执行一个方法的时候,值类型实例会在"栈"上分配内存,而引用类型实例会在"堆"上分配内存,当方法执行完毕,"栈"上的实例由操作系统自动释放,"堆"上的实例由.NET Framework的GC进行回收. 在" .NET的堆和栈02,值类型和

[.net 面向对象程序设计进阶] (8) 托管与非托管

本节导读:虽然在.NET编程过程中,绝大多数内存垃圾回收由CLR(公共语言运行时)自动回收,但也有很多需要我们编码回收.掌握托管与非托管的基本知识,可以有效避免某些情况下导致的程序异常. 1.什么是托管与非托管? 托管资源:一般是指被CLR(公共语言运行时)控制的内存资源,这些资源由CLR来管理.可以认为是.net 类库中的资源. 非托管资源:不受CLR控制和管理的资源. 对于托管资源,GC负责垃圾回收.对于非托管资源,GC可以跟踪非托管资源的生存期,但是不知道如何释放它,这时候就要人工进行释放

非托管 调用非托管资源的使用

调用非托管资源的使用 一.了解: 首先我们应该得了解什么是托管资源,什么又是非托管资源?带着问题去找答案,解决问题是不是就容易多了呢,接下来我们先来了解关于托管和非托管. 不懂不怕,就怕不去研究,有啥不会找度娘,听说新度娘 Very beautiful的哦,想不想看看呢,想的就跟我走吧!(看右边相关人物-传说中的新度娘竟然是程序袁!) 好了废话到此,是不是感觉好玩啊,不管做什么,当做玩,那么你会觉得很轻松.接下来进入正题: 托管: 托管资源(Managed Resource)是dot Net的一

C#的三大难点之二:托管与非托管

相关文章: C#的三大难点之前传:什么时候应该使用C#??C#的三大难点之一:byte与char,string与StringBuilderC#的三大难点之二:托管与非托管C#的三大难点之三:消息与事件 托管代码与非托管代码 众所周知,我们正常编程所用的高级语言,是无法被计算机识别的.需要先将高级语言翻译为机器语言,才能被机器理解和运行.在标准C/C++中,编译过程是这样的:源代码首先经过预处理器,对头文件以及宏进行解析,然后经过编译器,生成汇编代码,接着,经过汇编,生成机器指令,最后将所有文件连

C#中托管与非托管

在.net 编程环境中,系统的资源分为托管资源和非托管资源. 对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的 只是了解.net CLR如何做这些操作.也就是说对于您的应用程序创建的大多数对象,可以依靠 .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务. 对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如 System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方

.net 中的托管与非托管

托管代码 托管代码就是Visual Basic .NET和C#编译器编译出来的代码.编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码.中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据.你可以拷贝这个程序集到另一台服务器上部署它.通常来说,这个拷贝的动作就是部署流程中唯一的一个操作. 托管代码在公共语言运行库(CLR)中运行.这个运行库给你的运行代码提供各种各样的服务,通常来说,他会加载和验证程