声明:从MSDN 2005 Express上抄来的,不知道对不对,娃哈哈哈
提供了一系列用于申请非受管内存,拷贝非受管内存块,受管类型转化为非受管类型以及许多于非受管代码打交道的方法。(非受管内存看起来好难受,怎么说呢,内存现在有受管的也就是被垃圾自动回收机制管理的;和非受管的那就是需要手动管理的啦,这两种区别了,历史遗留问题向来都是难解决的)
Namespace: System.Runtime.InteropServices
Assembly: mscorlib (in mscorlib.dll)
原型
Visual Basic |
NotInheritable MustInherit Public Class Marshal |
C# |
public sealed abstract class Marshal |
C++ |
public __gc __sealed __abstract class Marshal |
JScript |
public abstract class Marshal |
Marshal类所提供这些静态方法主要是用作和非受管代码打交道的。大多数的方法是能让那些需要在受管和非受管模块之间建立桥梁的开发者自定义散列行为的高级应用。比如说,有这样一个方法StringToHGlobalAnsi他能够在一个指定的string实例中读取字符串(字符串处于受管堆中),然后放入非受管的缓冲区中(缓冲区在非受管的堆中),同时该缓冲区也被分配为合适的大小。 C#代码如下:
String s = "Hello"; IntPtr p = Marshal.StringToHGlobalAnsi(s); |
这时候p可以认为是一个指向的Ansi字符串"Hello"的指针哦。
common language runtime是如何提供散列功能的。欲知详情,请参考Interop Marshaling。
Marshal有着众多的成员,为了更好的了解他们,我们把成员按照用途进行了划分(软件以用为本,不记得是谁说的这句话,我承认有点道理)。
类别 | 成员 |
Advanced marshaling 高级 (看样子是没法分才分到这一类的,MS也学会了自卖自夸啊) | GetManagedThunkForUnmanagedMethodPtr, GetUnmanagedThunkForManagedMethodPtr, NumParamBytes |
COM library function COM 库函数 (千万别以为是串口…) | BindToMoniker, GetActiveObject |
COM utilities COM 相关 | ChangeWrapperHandleStrength, CreateWrapperOfType, GetComObjectData, GetComSlotForMethodInfo, GetEndComSlot, GetMethodInfoForComSlot, GetStartComSlot, ReleaseComObject, SetComObjectData |
Data transformation 数据传输/转化 | Managed to unmanaged: Copy, GetComInterfaceForObject, GetIDispatchForObject, GetIUnknownForObject, StringToBSTR, StringToCoTaskMemAnsi, StringToCoTaskMemAuto, StringToCoTaskMemUni, StringToHGlobalAnsi, StringToHGlobalAuto, StringToHGlobalUni, StructureToPtr, UnsafeAddrOfPinnedArrayElement Unmanaged to managed: Copy, GetObjectForIUnknown, GetObjectForNativeVariant, GetObjectsForNativeVariants, GetTypedObjectForIUnknown, GetTypeForITypeInfo, PtrToStringAnsi, PtrToStringAuto, PtrToStringBSTR, PtrToStringUni Properties: SystemDefaultCharSize, SystemMaxDBCSCharSize |
Direct reading and writing 直接存取 | ReadByte, ReadInt16, ReadInt32, ReadInt64, ReadIntPtr, WriteByte, WriteInt16, WriteInt32, WriteInt64, WriteIntPtr |
Error handling 出错处理 | COM: GetHRForException, ThrowExceptionForHR Win32: GetLastWin32Error, GetExceptionCode, GetExceptionPointers Both: GetHRForLastWin32Error |
Hosting utilities | GetThreadFromFiberCookie |
IUnknown | AddRef, QueryInterface, Release |
Memory management 内存管理 | COM: AllocCoTaskMem, ReAllocCoTaskMem, FreeCoTaskMem, FreeBSTR Win32: AllocHGlobal, ReAllocHGlobal, FreeHGlobal Both: DestroyStructure |
Platform invoke utilities 平台调用 | Prelink, PrelinkAll, GetHINSTANCE |
Structure inspection 结构信息 | OffsetOf, SizeOf |
Type information 类型 | GenerateGuidForType, GenerateProgIdForType, GetTypeInfoName, GetTypeLibGuid, GetTypeLibGuidForAssembly, GetTypeLibLcid, GetTypeLibName, IsComObject, IsTypeVisibleFromCom |
继承层次
System.Object
System.Runtime.InteropServices.Marshal
线程安全
只能说一部分public static (支持Visual Basic的)成员是线程安全的,而另一些就不能保证了。
开发平台
Windows 2000, and Windows XP Home Edition, Windows XP Professional, Windows Server 2003
NET Framework版本支持1.1,2.0