Marshal函数中文介绍C#

public static class Marshal

提供用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型的方法的集合,以及与非托管代码交互时使用的其他杂项方法。以下是介绍,每个介绍的最后给出了函数签名。


摘要: 表示系统上的默认字符大小;对于 Unicode 系统,默认值为 2,对于 ANSI 系统,默认值为 1。此字段是只读的。

public static readonly int SystemDefaultCharSize;


摘要:表示当前操作系统的双字节字符集 (DBCS) 大小(以字节为单位)的最大大小。此字段是只读的。

public static readonly int SystemMaxDBCSCharSize;


摘要: 递增指定接口上的引用计数。
参数:
pUnk:要递增的接口引用计数。
返回结果:pUnk 参数上引用计数的新值。

public static int AddRef(IntPtr pUnk);


摘要:从COM任务内存分配器中分配指定大小的内存块。
参数:
cb:要分配的内存块的大小。
返回结果:一个整数,表示所分配内存块的地址。此内存必须与 System.Runtime.InteropServices.Marshal.FreeCoTaskMem(System.IntPtr) 一起释放。
异常:
T:System.OutOfMemoryException:内存不足,无法满足请求。

public static IntPtr AllocCoTaskMem(int cb);


摘要:使用指定的字节数从进程的非托管内存中分配内存。
参数:
cb:内存中所需的字节数。
返回结果:指向新分配内存的指针。此内存必须使用 System.Runtime.InteropServices.Marshal.FreeHGlobal(System.IntPtr) 方法释放。
异常:
T:System.OutOfMemoryException:内存不足,无法满足请求。

public static IntPtr AllocHGlobal(int cb);


摘要:通过使用指针从进程的非托管内存中分配内存到指定数量的字节。
参数:
cb:内存中所需的字节数。
返回结果:指向新分配内存的指针。此内存必须使用 System.Runtime.InteropServices.Marshal.FreeHGlobal(System.IntPtr) 方法释放。
异常:
T:System.OutOfMemoryException:内存不足,无法满足请求。

public static IntPtr AllocHGlobal(IntPtr cb);


摘要:指示来自任何上下文的运行时可调用包装器 (RCW) 是否可用于清理。
返回结果:如果有任何 RCW 可用于清理,则返回结果;否则,为假。

public static bool AreComObjectsAvailableForCleanup();


摘要:获取由指定名字对象标识的接口指针。
参数:
名字对象名称:对应于所需接口指针的名称。
返回结果:一个对象,其中包含对由名字名 Name 参数标识的接口指针的引用。名字对象是一个名称,在本例中,名字对象由接口定义。
异常:
T:System.Runtime.InteropServices.COMException:未识别的 HRESULT 由非托管 BindToMoniker 方法返回。

public static object BindToMoniker(string monikerName);


摘要:更改对象的 COM 可调用包装 (CCW) 句柄的强度。
参数:
otp:其 CCW 保存引用计数句柄的对象。如果《特定常规武器公约》上的参考计数大于零,则句柄很强;否则,它是弱的。
fIsWeak:true 将 otp 参数上句柄的强度更改为弱,而不考虑其引用计数;false 以重置 otp 上的句柄强度以进行参考计数。

public static void ChangeWrapperHandleStrength(object otp, bool fIsWeak);


摘要:通知运行时清理当前上下文中分配的所有运行时可调用包装 (RCW)。

public static void CleanupUnusedObjectsInCurrentContext();


摘要:将数据从一维、受管的单精度浮点数数组复制到非托管内存指针。
参数:
源:要从中复制的一维数组。
startIndex:源数组中应开始复制的从零开始的索引。
目标:要复制到的内存指针。
length:要复制的数组元素数。
异常:
T:System.ArgumentOutOfRangeException: startIndex 和 length 是无效的。
T:System.ArgumentNullException:source、startIndex、destination 或 length 为 null。

public static void Copy(float[] source, int startIndex, IntPtr destination, int length);


摘要:将数据从一维的受管 System.IntPtr 数组复制到非受管内存指针。
参数:
源:要从中复制的一维数组。
startIndex:源数组中应开始复制的从零开始的索引。
目标:要复制到的内存指针。
length:要复制的数组元素数。
异常:
T:System.ArgumentNullException:source、destination、startIndex 或 length 为 null。

public static void Copy(IntPtr[] source, int startIndex, IntPtr destination, int length);


摘要:将数据从非托管内存指针复制到托管的单精度浮点数数组。
参数:
源:要从中复制的内存指针。
目标:要复制到的数组。
startIndex:应开始复制的目标数组中从零开始的索引。
length:要复制的数组元素数。
异常:
T:System.ArgumentNullException:source、destination、startIndex 或 length 为 null。

public static void Copy(IntPtr source, float[] destination, int startIndex, int length);


摘要:将数据从非托管内存指针复制到受管系统。IntPtr 阵列。
参数:
源:要从中复制的内存指针。
目标:要复制到的数组。
startIndex:应开始复制的目标数组中从零开始的索引。
length:要复制的数组元素数。
异常:
T:System.ArgumentNullException:source、destination、startIndex 或 length 为 null。

public static void Copy(IntPtr source, IntPtr[] destination, int startIndex, int length);


摘要:将数据从非托管内存指针复制到托管的 64 位有符号整数数组。
参数:
源:要从中复制的内存指针。
目标:要复制到的数组。
startIndex:应开始复制的目标数组中从零开始的索引。
length:要复制的数组元素数。
异常:
T:System.ArgumentNullException:source、destination、startIndex 或 length 为 null。

public static void Copy(IntPtr source, long[] destination, int startIndex, int length);


摘要:将数据从非托管内存指针复制到托管的 32 位有符号整数数组。
参数:
源:要从中复制的内存指针。
目标:要复制到的数组。
startIndex:应开始复制的目标数组中从零开始的索引。
length:要复制的数组元素数。
异常:
T:System.ArgumentNullException:source、destination、startIndex 或 length 为 null。

public static void Copy(IntPtr source, int[] destination, int startIndex, int length);


摘要:将数据从非托管内存指针复制到托管的双精度浮点数数组。
参数:
源:要从中复制的内存指针。
目标:要复制到的数组。
startIndex:应开始复制的目标数组中从零开始的索引。
length:要复制的数组元素数。
异常:
T:System.ArgumentNullException:source、destination、startIndex 或 length 为 null。

public static void Copy(IntPtr source, double[] destination, int startIndex, int length);


摘要:将数据从非托管内存指针复制到托管的 16 位有符号整数数组。
参数:
源:要从中复制的内存指针。
目标:要复制到的数组。
startIndex:应开始复制的目标数组中从零开始的索引。
length:要复制的数组元素数。
异常:
T:System.ArgumentNullException:source、destination、startIndex 或 length 为 null。

public static void Copy(IntPtr source, short[] destination, int startIndex, int length);


摘要:将数据从非托管内存指针复制到托管的 8 位无符号整数数组。
参数:
源:要从中复制的内存指针。
目标:要复制到的数组。
startIndex:应开始复制的目标数组中从零开始的索引。
length:要复制的数组元素数。
异常:
T:System.ArgumentNullException:source、destination、startIndex 或 length 为 null。

public static void Copy(IntPtr source, byte[] destination, int startIndex, int length);


摘要:将数据从一维的、受管的 64 位有符号整数数组复制到非托管内存指针。
参数:
源:要从中复制的一维数组。
startIndex:源数组中应开始复制的从零开始的索引。
目标:要复制到的内存指针。
length:要复制的数组元素数。
异常:
T:System.ArgumentOutOfRangeException: startIndex 和 length 是无效的。
T:System.ArgumentNullException:source、startIndex、destination 或 length 为 null。

public static void Copy(long[] source, int startIndex, IntPtr destination, int length);


摘要:将数据从一维的、受管的 32 位有符号整数数组复制到非托管内存指针。
参数:
源:要从中复制的一维数组。
startIndex:源数组中应开始复制的从零开始的索引。
目标:要复制到的内存指针。
length:要复制的数组元素数。
异常:
T:System.ArgumentOutOfRangeException: startIndex 和 length 是无效的。
T:System.ArgumentNullException:startIndex 或 length 为 null。

public static void Copy(int[] source, int startIndex, IntPtr destination, int length);


摘要:将数据从一维、受管的 16 位有符号整数数组复制到非托管内存指针。
参数:
源:要从中复制的一维数组。
startIndex:源数组中应开始复制的从零开始的索引。
目标:要复制到的内存指针。
length:要复制的数组元素数。
异常:
T:System.ArgumentOutOfRangeException: startIndex 和 length 是无效的。
T:System.ArgumentNullException:source、startIndex、destination 或 length 为 null。

public static void Copy(short[] source, int startIndex, IntPtr destination, int length);


摘要:将数据从一维、受管的双精度浮点数数组复制到非托管内存指针。
参数:
源:要从中复制的一维数组。
startIndex:源数组中应开始复制的从零开始的索引。
目标:要复制到的内存指针。
length:要复制的数组元素数。
异常:
T:System.ArgumentOutOfRangeException: startIndex 和 length 是无效的。
T:System.ArgumentNullException:source、startIndex、destination 或 length 为 null。

public static void Copy(double[] source, int startIndex, IntPtr destination, int length);


摘要:将数据从一维的托管字符数组复制到非托管内存指针。
参数:
源:要从中复制的一维数组。
startIndex:源数组中应开始复制的从零开始的索引。
目标:要复制到的内存指针。
length:要复制的数组元素数。
异常:
T:System.ArgumentOutOfRangeException: startIndex 和 length 是无效的。
T:System.ArgumentNullException:startIndex、destination 或 length 为 null。

public static void Copy(char[] source, int startIndex, IntPtr destination, int length);


摘要:将数据从一维、受管的 8 位无符号整数数组复制到非托管内存指针。
参数:
源:要从中复制的一维数组。
startIndex:源数组中应开始复制的从零开始的索引。
目标:要复制到的内存指针。
length:要复制的数组元素数。
异常:
T:System.ArgumentOutOfRangeException: startIndex 和 length 是无效的。
T:System.ArgumentNullException:source、startIndex、destination 或 length 为 null。

public static void Copy(byte[] source, int startIndex, IntPtr destination, int length);


摘要:将数据从非托管内存指针复制到托管字符数组。
参数:
源:要从中复制的内存指针。
目标:要复制到的数组。
startIndex:应开始复制的目标数组中从零开始的索引。
length:要复制的数组元素数。
异常:
T:System.ArgumentNullException:source、destination、startIndex 或 length 为 null。

public static void Copy(IntPtr source, char[] destination, int startIndex, int length);


摘要:聚合具有指定 COM 对象的托管对象。
参数:
pOuter:外部 I 未知指针。
o:要聚合的对象。
返回结果:托管对象的内部 IUnknown 指针。
异常:
T:System.ArgumentException: o 是一个 Windows 运行时对象。
[EditorBrowsable(EditorBrowsableState.Never)]

public static IntPtr CreateAggregatedObject(IntPtr pOuter, object o);


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 将指定类型的托管对象与指定的 COM 对象聚合。
参数:
pOuter:外部 I 未知指针。
o:要聚合的托管对象。
类型参数:
T:要聚合的托管对象的类型。
返回结果:托管对象的内部 IUnknown 指针。
异常:
T:System.ArgumentException: o 是一个 Windows 运行时对象。

public static IntPtr CreateAggregatedObject(IntPtr pOuter, T o) where T : notnull;


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 将指定的 COM 对象包装在指定类型的对象中。
参数:
o:要包装的对象。
类型参数:
T:要包装的对象的类型。
TWrapper:要返回的对象的类型。
返回结果: 新包装的对象。
异常:
T:System.ArgumentException:T 必须从__ComObject派生而来。-or- T 是 Windows 运行时类型。
T:System.InvalidCastException: o 无法转换为 TWrapper,因为它不支持所有必需的接口。

public static TWrapper CreateWrapperOfType<T, TWrapper>([AllowNull] T o);


摘要:将指定的 COM 对象包装在指定类型的对象中。
参数:
o:要包装的对象。
t:要创建的包装器的类型。
返回结果:作为所需类型的实例的新包装对象。
异常:
T:System.ArgumentException: t 必须从__ComObject派生而来。-or- t 是 Windows 运行时类型。
T:System.ArgumentNullException:t 参数为 null。
T:System.InvalidCastException: o 无法转换为目标类型,因为它不支持所有必需的接口。
[EditorBrowsable(EditorBrowsableState.Never)]
[return: NotNullIfNotNull(“o”)]

public static object? CreateWrapperOfType(object? o, Type t);


摘要:释放指定的非托管内存块指向的所有子结构。
参数:
ptr:指向非托管内存块的指针。
结构类型:格式化类的类型。这提供了删除 ptr 参数中的缓冲区所需的布局信息。
异常:
T:System.ArgumentException: structureType 具有自动布局。请改用顺序或显式。
[EditorBrowsable(EditorBrowsableState.Never)]

public static void DestroyStructure(IntPtr ptr, Type structuretype);


摘要:[在 .NET Framework 4.5.1 及更高版本中受支持] 释放指定非托管内存块所指向的指定类型的所有子结构。
参数:
ptr:指向非托管内存块的指针。
类型参数:
T:格式化结构的类型。这提供了删除 ptr 参数中的缓冲区所需的布局信息。
异常:
T:System.ArgumentException:T 有一个自动布局。请改用顺序或显式。

public static void DestroyStructure(IntPtr ptr);


摘要:通过将运行时可调用包装 (RCW) 的引用计数设置为 0 来释放对该包装器 (RCW) 的所有引用。
参数:
o:要发布的 RCW。
返回结果:与 o 参数关联的 RCW 的引用计数的新值,如果发布成功,则为 0(零)。
异常:
T:System.ArgumentException: o 不是有效的 COM 对象。
T:System.ArgumentNullException: o is null.

public static int FinalReleaseComObject(object o);


摘要:使用 COM SysFreeString 函数释放 BSTR。
参数:
ptr:要释放的 BSTR 的地址。

public static void FreeBSTR(IntPtr ptr);


摘要:释放由非托管 COM 任务内存分配器分配的内存块。
参数:
ptr:要释放的内存的地址。

public static void FreeCoTaskMem(IntPtr ptr);


摘要:释放先前从进程的非托管内存中分配的内存。
参数:
hglobal:由对 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 的原始匹配调用返回的句柄。

public static void FreeHGlobal(IntPtr hglobal);


摘要:返回指定类型的全局唯一标识符 (GUID),或使用类型库导出程序 (Tlbexp.exe) 使用的算法生成 GUID。
参数:
类型:要为其生成 GUID 的类型。
返回结果: 指定类型的标识符。

public static Guid GenerateGuidForType(Type type);


摘要:返回指定类型的编程标识符 (ProgID)。
参数:
type:要获取其 ProgID 的类型。
返回结果: 指定类型的 ProgID。
异常:
T:System.ArgumentException:type 参数不是 COM 可以创建的类。该类必须是公共的,具有公共无参数构造函数,并且是 COM 可见的。
T:System.ArgumentNullException:type 参数为 null。

public static string? GenerateProgIdForType(Type type);


摘要:[在 .NET Framework 4.5.1 及更高版本中受支持] 返回一个指针,该指针指向一个 IUnknown 接口,该接口表示指定类型的对象上的指定接口。默认情况下,自定义查询接口访问处于启用状态。
参数:
o:提供接口的对象。
类型参数:
T:o的类型。
接口:要返回的接口类型。
返回结果:表示接口接口的接口指针。
异常:
T:System.ArgumentException:TInterface 参数不是接口。-or- 该类型对 COM 不可见。 -or- T 参数是一个开放的泛型类型。
T:System.InvalidCastException:o 参数不支持 TInterface 接口。
T:System.ArgumentNullException:o 参数为 null。

public static IntPtr GetComInterfaceForObject<T, TInterface>([DisallowNull] T o);


摘要:返回指向 I 未知接口的指针,该接口表示指定对象上的指定接口。默认情况下,自定义查询接口访问处于启用状态。
参数:
o:提供接口的对象。
T:请求的接口类型。
返回结果:表示对象的指定接口的接口指针。
异常:
T:System.ArgumentException:T 参数不是接口。-or- 该类型对 COM 不可见。 -or- T 参数是泛型类型定义。
T:System.InvalidCastException:o 参数不支持请求的接口。
T:System.ArgumentNullException:o 参数为 null。- 或 - T 参数为空。
[EditorBrowsable(EditorBrowsableState.Never)]

public static IntPtr GetComInterfaceForObject(object o, Type T);


摘要:返回指向 I 未知接口的指针,该接口表示指定对象上的指定接口。自定义查询接口访问由指定的自定义模式控制。
参数:
o:提供接口的对象。
T:请求的接口类型。
mode:指示是否应用由 System.Runtime.InteropServices.ICustomQueryInterface 提供的 IUnknown::QueryInterface 自定义项的枚举值之一。
返回结果:表示对象的接口的接口指针。
异常:
T:System.ArgumentException:T 参数不是接口。-or- 该类型对 COM 不可见。 -or- T 参数是泛型类型定义。
T:System.InvalidCastException:对象 o 不支持请求的接口。
T:System.ArgumentNullException:o 参数为 null。- 或 - T 参数为空。
[EditorBrowsable(EditorBrowsableState.Never)]

public static IntPtr GetComInterfaceForObject(object o, Type T, CustomQueryInterfaceMode mode);


摘要:从指定的COM对象中检索指定键引用的数据。
参数:
obj:包含所需数据的 COM 对象。
key:obj 内部哈希表中用于检索数据的键。
返回结果:由 obj 参数的内部哈希表中的键参数表示的数据。
异常:
T:System.ArgumentNullException: obj is null.-or- 键为空。
T:System.ArgumentException: obj 不是 COM 对象。-or- obj 是一个 Windows 运行时对象。

public static object? GetComObjectData(object obj, object key);


摘要:将非托管函数指针转换为委托。
参数:
ptr:要转换的非托管函数指针。
t:要返回的委托的类型。
返回结果:可以强制转换为相应委托类型的委托实例。
异常:
T:System.ArgumentException:t 参数不是委托或泛型参数。
T:System.ArgumentNullException:ptr 参数为 null。-or- t 参数为空。
[EditorBrowsable(EditorBrowsableState.Never)]

public static Delegate GetDelegateForFunctionPointer(IntPtr ptr, Type t);


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 将非托管函数指针转换为指定类型的委托。
参数:
ptr:要转换的非托管函数指针。
类型参数:
TDelegate:要返回的委托的类型。
返回结果:指定委托类型的实例。
异常:
T:System.ArgumentException:TDelegate 泛型参数不是委托,或者它是一个开放的泛型类型。
T:System.ArgumentNullException:ptr 参数为 null。

public static TDelegate GetDelegateForFunctionPointer(IntPtr ptr);


摘要:检索向 COM 公开时某种类型的虚拟功能表(v 表或 VTBL)中的最后一个插槽。
参数:
t:表示接口或类的类型。
返回结果:接口向 COM 公开时的最后一个 VTBL 插槽。如果 t 参数是一个类,则返回的 VTBL 插槽是从该类生成的接口中的最后一个插槽。

public static int GetEndComSlot(Type t);


摘要:检索标识所发生异常类型的代码。
返回结果: 异常的类型。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“GetExceptionCode() may be unavailable in future releases.”)]

public static int GetExceptionCode();


摘要:将指定的 HRESULT 错误代码转换为相应的 System.Exception 对象。
参数:
错误代码:要转换的 HRESULT。
返回结果:表示转换后的 HRESULT 的对象,如果 HRESULT 值不表示错误代码(例如,S_OK或S_FALSE),则为 null。

public static Exception? GetExceptionForHR(int errorCode);


摘要:将指定的 HRESULT 错误代码转换为相应的 System.Exception 对象,并在异常对象的 IErrorInfo 接口中传递其他错误信息。
参数:
错误代码:要转换的 HRESULT。
errorInfo:指向 IErrorInfo 接口的指针,提供有关错误的详细信息。您可以指定 IntPtr(0) 以使用当前的 IErrorInfo 接口,或指定 IntPtr(-1) 以忽略当前的 IErrorInfo 接口并仅从错误代码构造异常。
返回结果:表示转换后的 HRESULT 和从 errorInfo 获取的信息的对象,如果 HRESULT 值不表示错误代码(例如,S_OK或S_FALSE),则为 null。

public static Exception? GetExceptionForHR(int errorCode, IntPtr errorInfo);


摘要:检索异常的独立于计算机的描述,以及有关发生异常时线程存在的状态的信息。
返回结果:指向EXCEPTION_POINTERS结构的指针。

public static IntPtr GetExceptionPointers();


摘要:将委托转换为可从非托管代码调用的函数指针。
参数:
d:要传递给非托管代码的委托。
返回结果:可以传递给非托管代码的值,而非托管代码又可以使用它来调用基础托管委托。
异常:
T:System.ArgumentException:d 参数是泛型类型定义。
T:System.ArgumentNullException:d 参数为 null。
[EditorBrowsable(EditorBrowsableState.Never)]

public static IntPtr GetFunctionPointerForDelegate(Delegate d);


摘要:[在 .NET Framework 4.5.1 及更高版本中受支持] 将指定类型的委托转换为可从非托管代码调用的函数指针。
参数:
d:要传递给非托管代码的委托。
类型参数:
TDelegate:要转换的委托的类型。
返回结果:可以传递给非托管代码的值,而非托管代码又可以使用它来调用基础托管委托。
异常:
T:System.ArgumentException:d 参数是泛型类型定义。
T:System.ArgumentNullException:d 参数为 null。

public static IntPtr GetFunctionPointerForDelegate(TDelegate d) where TDelegate : notnull;


摘要:返回指定模块的实例句柄(HINSTANCE)。
参数:
m:需要其阻碍力的模块。
返回结果:如果模块没有障碍,则为 -1。
异常:
T:System.ArgumentNullException:m 参数为 null。

public static IntPtr GetHINSTANCE(Module m);


摘要:将指定的异常转换为 HRESULT。
参数:
e:转换为 HRESULT 的异常。
返回结果: HRESULT 映射到提供的异常。

public static int GetHRForException(Exception? e);


摘要:返回与使用 System.Runtime.InteropServices.Marshal 执行的 Win32 代码所发生的最后一个错误相对应的 HRESULT。
返回结果:对应于最后一个 Win32 错误代码的 HRESULT。

public static int GetHRForLastWin32Error();


摘要:从托管对象返回 IDispatch 接口。
参数:
o:请求其 IDispatch 接口的对象。
返回结果: o 参数的 IDispatch 指针。
异常:
T:System.InvalidCastException: o 不支持请求的接口。

public static IntPtr GetIDispatchForObject(object o);


摘要:从托管对象返回未知接口。
参数:
o:请求其未知接口的对象。
返回结果: o 参数的 IUnknown 指针。

public static IntPtr GetIUnknownForObject(object o);


摘要:返回最后一个非托管函数返回的错误代码,该函数是使用设置了 System.Runtime.InteropServices.DllImportAttribute.SetLastError 标志的平台调用的。
返回结果:通过调用 Win32 SetLastError 函数设置的最后一个错误代码。

public static int GetLastWin32Error();


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 将指定类型的对象转换为 COM VARIANT。
参数:
obj:要为其获取 COM 变体的对象。
pDstNativeVariant:用于接收与 obj 参数对应的 VARIANT 的指针。
类型参数:
T:要转换的对象的类型。
[EditorBrowsable(EditorBrowsableState.Never)]

public static void GetNativeVariantForObject([AllowNull] T obj, IntPtr pDstNativeVariant);


摘要:将对象转换为 COM 变体。
参数:
obj:要为其获取 COM 变体的对象。
pDstNativeVariant:用于接收与 obj 参数对应的 VARIANT 的指针。
异常:
T:System.ArgumentException:obj 参数是泛型类型的一个实例。
[EditorBrowsable(EditorBrowsableState.Never)]

public static void GetNativeVariantForObject(object? obj, IntPtr pDstNativeVariant);


摘要:返回一个类型的实例,该实例通过指向 COM 对象的指针来表示其 I 未知接口。
参数:
pUnk:指向 IUnknown 接口的指针。
返回结果:表示指定的非托管 COM 对象的对象。

public static object GetObjectForIUnknown(IntPtr pUnk);


摘要:将 COM 变体转换为对象。
参数:
pSrcNativeVariant:指向 COM 变体的指针。
返回结果:与 pSrcNativeVariant 参数对应的对象。
异常:
T:System.Runtime.InteropServices.InvalidOleVariantTypeException: pSrcNativeVariant 不是有效的 VARIANT 类型。
T:System.NotSupportedException: pSrcNativeVariant 具有不受支持的类型。
[EditorBrowsable(EditorBrowsableState.Never)]

public static object? GetObjectForNativeVariant(IntPtr pSrcNativeVariant);


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 将 COM VARIANT 转换为指定类型的对象。
参数:
pSrcNativeVariant:指向 COM 变体的指针。
类型参数:
T:要将 COM 变体转换为的类型。
返回结果:与 pSrcNativeVariant 参数对应的指定类型的对象。
异常:
T:System.Runtime.InteropServices.InvalidOleVariantTypeException: pSrcNativeVariant 不是有效的 VARIANT 类型。
T:System.NotSupportedException: pSrcNativeVariant 具有不受支持的类型。
[EditorBrowsable(EditorBrowsableState.Never)]
[return: MaybeNull]

public static T GetObjectForNativeVariant(IntPtr pSrcNativeVariant);


摘要:将 COM VARIANTs 数组转换为对象数组。
参数:
aSrcNativeVariant:指向 COM VARIANTs 数组的第一个元素的指针。
cVars:aSrcNativeVariant 中 COM VARIANTs 的计数。
返回结果:对应于 aSrcNativeVariant 的对象数组。
异常:
T:System.ArgumentOutOfRangeException: cVars 是一个负数。
[EditorBrowsable(EditorBrowsableState.Never)]

public static object?[] GetObjectsForNativeVariants(IntPtr aSrcNativeVariant, int cVars);


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 将 COM VARIANT 数组转换为指定类型的数组。
参数:
aSrcNativeVariant:指向 COM VARIANTs 数组的第一个元素的指针。
cVars:aSrcNativeVariant 中 COM VARIANTs 的计数。
类型参数:
T:要返回的数组的类型。
返回结果:对应于 aSrcNativeVariant 的 T 对象数组。
异常:
T:System.ArgumentOutOfRangeException: cVars 是一个负数。
[EditorBrowsable(EditorBrowsableState.Never)]

public static T[] GetObjectsForNativeVariants(IntPtr aSrcNativeVariant, int cVars);


摘要:获取包含用户定义方法的虚拟函数表(v-table 或 VTBL)中的第一个插槽。
参数:
t:表示接口或类的类型。
返回结果:包含用户定义方法的第一个 VTBL 槽。如果接口基于 IUnknown,则第一个插槽为 3;如果接口基于 IDispatch,则第一个插槽为 7。
异常:
T:System.ArgumentException: t 在 COM 中不可见。

public static int GetStartComSlot(Type t);


摘要:返回指定类型的托管对象,表示 COM 对象。
参数:
pUnk:指向非托管对象的 I 未知接口的指针。
t:所请求的托管类的类型。
返回结果:与 System.Type 对象对应的类的实例,该对象表示请求的非托管 COM 对象。
异常:
T:System.ArgumentException: t 不归因于 System.Runtime.InteropServices.ComImportAttribute。-or- t 是 Windows 运行时类型。

public static object GetTypedObjectForIUnknown(IntPtr pUnk, Type t);


摘要:返回与指定类标识符 (CLSID) 关联的类型。
参数:
clsid:要返回的类型的 CLSID。
返回结果: System.__ComObject无论 CLSID 是否有效。

public static Type GetTypeFromCLSID(Guid clsid);


摘要:检索由 ITypeInfo 对象表示的类型的名称。
参数:
typeInfo:一个表示 ITypeInfo 指针的对象。
返回结果:typeInfo 参数指向的类型的名称。
异常:
T:System.ArgumentNullException:typeInfo 参数为 null。

public static string GetTypeInfoName(ITypeInfo typeInfo);


摘要:为给定的 I 未知接口创建唯一的运行时可调用包装 (RCW) 对象。
参数:
未知:指向未知接口的托管指针。
返回结果:指定 I 未知接口的唯一 RCW。

public static object GetUniqueObjectForIUnknown(IntPtr unknown);


摘要:表示指定的对象是否表示 COM 对象。
参数:
o:要检查的对象。
返回结果: 如果 o 参数是 COM 类型,则为 true;否则,为假。
异常:
T:System.ArgumentNullException: o is null.

public static bool IsComObject(object o);


摘要:指示类型对 COM 客户端是否可见。
参数:
t:要检查 COM 可见性的类型。
返回结果: 如果类型对 COM 可见,则为 true;否则,为假。

public static bool IsTypeVisibleFromCom(Type t);


摘要:返回托管类的非托管形式的字段偏移量。
参数:
t:指定托管类的值类型或格式化引用类型。必须将 System.Runtime.InteropServices.StructLayoutAttribute 应用于该类。
字段名称:t 参数中的字段。
返回结果:由平台调用声明的指定类中的 fieldName 参数的偏移量(以字节为单位)。
异常:
T:System.ArgumentException:类不能导出为结构,或者字段是非公共的。从 .NET Framework 2.0 版开始,该字段可能是私有的。
T:System.ArgumentNullException:t 参数为 null。
[EditorBrowsable(EditorBrowsableState.Never)]

public static IntPtr OffsetOf(Type t, string fieldName);


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 返回指定托管类的非托管形式的字段偏移量。
参数:
字段名称:T 类型中字段的名称。
类型参数:
T:托管值类型或格式化引用类型。必须将 System.Runtime.InteropServices.StructLayoutAttribute 特性应用于该类。
返回结果:由平台调用声明的指定类中的 fieldName 参数的偏移量(以字节为单位)。

public static IntPtr OffsetOf(string fieldName);


摘要:执行一次性方法设置任务,无需调用方法。
参数:
m:要检查的方法。
异常:
T:System.ArgumentNullException:m 参数为 null。
T:System.ArgumentException:m 参数不是 System.Reflection.MethodInfo 对象。

public static void Prelink(MethodInfo m);


摘要:对类上的所有方法执行预链接检查。
参数:
c:要检查其方法的类。
异常:
T:System.ArgumentNullException:c 参数为 null。

public static void PrelinkAll(Type c);


摘要:分配一个受管系统。字符串,将指定数量的字符从非托管 ANSI 字符串复制到其中,并将每个 ANSI 字符加宽为 Unicode。
参数:
ptr:非托管字符串的第一个字符的地址。
len:要复制的输入字符串的字节计数。
返回结果:一个托管字符串,如果 ptr 参数的值不为 null,则保存本机 ANSI 字符串的副本;否则,此方法返回 null。
异常:
T:System.ArgumentException: len 小于零。

public static string PtrToStringAnsi(IntPtr ptr, int len);


摘要:将所有字符(直到第一个空字符)从非托管 ANSI 字符串复制到托管系统。字符串,并将每个 ANSI 字符加宽为 Unicode。
参数:
ptr:非托管字符串的第一个字符的地址。
返回结果:一个托管字符串,用于保存非托管 ANSI 字符串的副本。如果 ptr 为空,则该方法返回空字符串。

public static string? PtrToStringAnsi(IntPtr ptr);


摘要:分配一个被管理的系统。String,并将存储在非托管内存中的字符串中指定数量的字符复制到其中。
参数:
ptr:对于 Unicode 平台,第一个 Unicode 字符的地址。-or-对于 ANSI 平台,第一个 ANSI 字符的地址。
len:要复制的字符数。
返回结果:一个托管字符串,如果 ptr 参数的值不为 null,则保存本机字符串的副本;否则,此方法返回 null。
异常:
T:System.ArgumentException: len 小于零。

public static string? PtrToStringAuto(IntPtr ptr, int len);


摘要:分配一个被管系统。String,并将存储在非被管内存中的字符串中所有字符(直到第一个空字符)复制到其中。
参数:
ptr:对于 Unicode 平台,第一个 Unicode 字符的地址。-or-对于 ANSI 平台,第一个 ANSI 字符的地址。
返回结果:一个托管字符串,如果 ptr 参数的值不为 null,则保存非托管字符串的副本;否则,此方法返回 null。

public static string? PtrToStringAuto(IntPtr ptr);


摘要:分配一个被管系统。字符串并将存储在非托管内存中的二进制字符串(BSTR)复制到其中。
参数:
ptr:非托管字符串的第一个字符的地址。
返回结果:保存非托管字符串副本的托管字符串。
异常:
T:System.ArgumentNullException: ptr equals System.IntPtr.Zero.

public static string PtrToStringBSTR(IntPtr ptr);


摘要:分配一个受管 System.String,并将非托管 Unicode 字符串中所有字符(直到第一个空字符)复制到其中。
参数:
ptr:非托管字符串的第一个字符的地址。
返回结果:一个托管字符串,如果 ptr 参数的值不为 null,则保存非托管字符串的副本;否则,此方法返回 null。

public static string? PtrToStringUni(IntPtr ptr);


摘要:分配一个受管系统。字符串,并将非托管 Unicode 字符串中指定数量的字符复制到其中。
参数:
ptr:非托管字符串的第一个字符的地址。
len:要复制的 Unicode 字符数。
返回结果:一个托管字符串,如果 ptr 参数的值不为 null,则保存非托管字符串的副本;否则,此方法返回 null。

public static string PtrToStringUni(IntPtr ptr, int len);

参数:
ptr:

public static string? PtrToStringUTF8(IntPtr ptr);

参数:
ptr:
字节长度:

public static string PtrToStringUTF8(IntPtr ptr, int byteLen);


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 将数据从非托管内存块封送到由泛型类型参数指定的类型的新分配的托管对象。
参数:
ptr:指向非托管内存块的指针。
类型参数:
T:要将数据复制到的对象的类型。这必须是格式化的类或结构。
返回结果:包含 ptr 参数指向的数据的托管对象。
异常:
T:System.ArgumentException:T 的布局不是连续的或显式的。
T:System.MissingMethodException:T 指定的类没有可访问的无参数构造函数。
[return: MaybeNull]

public static T PtrToStructure(IntPtr ptr);


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 将数据从非托管内存块封送到指定类型的托管对象。
参数:
ptr:指向非托管内存块的指针。
结构:要将数据复制到的对象。
类型参数:
T:结构的类型。这必须是格式化的类。
异常:
T:System.ArgumentException:结构布局不是连续的或显式的。

public static void PtrToStructure(IntPtr ptr, [DisallowNull] T structure);


摘要:将数据从非托管内存块封送到托管对象。
参数:
ptr:指向非托管内存块的指针。
结构:要将数据复制到的对象。这必须是格式化类的实例。
异常:
T:System.ArgumentException:结构布局不是连续的或显式的。-or- 结构是盒装值类型。
[EditorBrowsable(EditorBrowsableState.Never)]

public static void PtrToStructure(IntPtr ptr, object structure);


摘要:将数据从非托管内存块封送到指定类型的新分配的托管对象。
参数:
ptr:指向非托管内存块的指针。
结构类型:要创建的对象的类型。此对象必须表示格式化的类或结构。
返回结果:包含 ptr 参数所指向的数据的托管对象。
异常:
T:System.ArgumentException:structureType 参数布局不是顺序的或显式的。-or- 结构类型参数是泛型类型定义。
T:System.ArgumentNullException: structureType is null。
T:System.MissingMethodException:structureType 指定的类没有可访问的无参数构造函数。
[EditorBrowsable(EditorBrowsableState.Never)]

public static object? PtrToStructure(IntPtr ptr, Type structureType);


摘要:从 COM 对象请求指向指定接口的指针。
参数:
pUnk:要查询的接口。
iid:所请求接口的接口标识符 (IID)。
ppv:此方法返回时,包含对返回接口的引用。
返回结果:指示呼叫成功或失败的 HRESULT。

public static int QueryInterface(IntPtr pUnk, ref Guid iid, out IntPtr ppv);


摘要: 从非托管内存中读取单个字节。
参数:
ptr:非托管内存中要从中读取的地址。
返回结果: 从非托管内存中读取的字节。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static byte ReadByte(IntPtr ptr);


摘要:从非托管内存中读取给定偏移量(或索引)处的单字节。
参数:
ptr:非托管内存中要从中读取的基址。
ofs:一个额外的字节偏移量,在读取之前添加到 ptr 参数中。
返回结果:以给定偏移量从非托管内存读取的字节。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static byte ReadByte(IntPtr ptr, int ofs);


摘要:从非托管内存中读取给定偏移量(或索引)处的单字节。
参数:
ptr:源对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在读取之前添加到 ptr 参数中。
返回结果:以给定偏移量从非托管内存读取的字节。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“ReadByte(Object, Int32) may be unavailable in future releases.”)]

public static byte ReadByte(object ptr, int ofs);


摘要:从非托管内存中读取给定偏移量处的 16 位有符号整数。
参数:
ptr:源对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在读取之前添加到 ptr 参数中。
返回结果:以给定偏移量从非托管内存读取的 16 位有符号整数。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“ReadInt16(Object, Int32) may be unavailable in future releases.”)]

public static short ReadInt16(object ptr, int ofs);


摘要:从非托管内存中读取 16 位有符号整数。
参数:
ptr:非托管内存中要从中读取的地址。
返回结果:从非托管内存中读取的 16 位有符号整数。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static short ReadInt16(IntPtr ptr);


摘要:从非托管内存中读取给定偏移量处的 16 位有符号整数。
参数:
ptr:非托管内存中要从中读取的基址。
ofs:一个额外的字节偏移量,在读取之前添加到 ptr 参数中。
返回结果:以给定偏移量从非托管内存读取的 16 位有符号整数。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static short ReadInt16(IntPtr ptr, int ofs);


摘要:从非托管内存中读取给定偏移量的 32 位有符号整数。
参数:
ptr:源对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在读取之前添加到 ptr 参数中。
返回结果:以给定偏移量从非托管内存读取的 32 位有符号整数。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“ReadInt32(Object, Int32) may be unavailable in future releases.”)]

public static int ReadInt32(object ptr, int ofs);


摘要:从非托管内存中读取给定偏移量的 32 位有符号整数。
参数:
ptr:非托管内存中要从中读取的基址。
ofs:一个额外的字节偏移量,在读取之前添加到 ptr 参数中。
返回结果:从非托管内存中读取的 32 位有符号整数。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static int ReadInt32(IntPtr ptr, int ofs);


摘要:从非托管内存中读取 32 位有符号整数。
参数:
ptr:非托管内存中要从中读取的地址。
返回结果:从非托管内存中读取的 32 位有符号整数。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static int ReadInt32(IntPtr ptr);


摘要:从非托管内存中读取 64 位有符号整数。
参数:
ptr:非托管内存中要从中读取的地址。
返回结果:从非托管内存中读取的 64 位有符号整数。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static long ReadInt64(IntPtr ptr);


摘要:从非托管内存中读取给定偏移量的 64 位有符号整数。
参数:
ptr:非托管内存中要从中读取的基址。
ofs:一个额外的字节偏移量,在读取之前添加到 ptr 参数中。
返回结果:以给定偏移量从非托管内存读取的 64 位有符号整数。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static long ReadInt64(IntPtr ptr, int ofs);


摘要:从非托管内存中读取给定偏移量的 64 位有符号整数。
参数:
ptr:源对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在读取之前添加到 ptr 参数中。
返回结果:以给定偏移量从非托管内存读取的 64 位有符号整数。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“ReadInt64(Object, Int32) may be unavailable in future releases.”)]

public static long ReadInt64(object ptr, int ofs);


摘要:从非托管内存中读取处理器本机大小的整数。
参数:
ptr:非托管内存中要从中读取的地址。
返回结果:从非托管内存中读取的整数。32 位机器上返回 32 位整数,64 位机器上返回 64 位整数。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static IntPtr ReadIntPtr(IntPtr ptr);


摘要:从非托管内存中读取处理器在给定偏移处的本机大小整数。
参数:
ptr:非托管内存中要从中读取的基址。
ofs:一个额外的字节偏移量,在读取之前添加到 ptr 参数中。
返回结果:以给定偏移量从非托管内存读取的整数。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static IntPtr ReadIntPtr(IntPtr ptr, int ofs);


摘要:从非托管内存中读取处理器的本机大小整数。
参数:
ptr:源对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在读取之前添加到 ptr 参数中。
返回结果:以给定偏移量从非托管内存读取的整数。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“ReadIntPtr(Object, Int32) may be unavailable in future releases.”)]

public static IntPtr ReadIntPtr(object ptr, int ofs);


摘要:调整以前使用 System.Runtime.InteropServices.Marshal.AllocCoTaskMem(System.Int32) 分配的内存块的大小。
参数:
pv:指向使用 System.Runtime.InteropServices.Marshal.AllocCoTaskMem(System.Int32) 分配的内存的指针。
cb:已分配块的新大小。
返回结果:一个整数,表示重新分配的内存块的地址。此内存必须与 System.Runtime.InteropServices.Marshal.FreeCoTaskMem(System.IntPtr) 一起释放。
异常:
T:System.OutOfMemoryException:内存不足,无法满足请求。

public static IntPtr ReAllocCoTaskMem(IntPtr pv, int cb);


摘要:调整以前使用 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 分配的内存块的大小。
参数:
pv:指向使用 System.Runtime.InteropServices.Marshal.AllocHGlobal(System.IntPtr) 分配的内存的指针。
cb:已分配块的新大小。这不是一个指针;它是您正在请求的字节计数,强制转换为类型 System.IntPtr。如果传递指针,则会将其视为大小。
返回结果:指向重新分配的内存的指针。此内存必须使用 System.Runtime.InteropServices.Marshal.FreeHGlobal(System.IntPtr) 释放。
异常:
T:System.OutOfMemoryException:内存不足,无法满足请求。

public static IntPtr ReAllocHGlobal(IntPtr pv, IntPtr cb);


摘要:递减指定接口上的引用计数。
参数:
pUnk:要释放的接口。
返回结果:由 pUnk 参数指定的接口上的引用计数的新值。

public static int Release(IntPtr pUnk);


摘要:递减与指定 COM 对象关联的运行时可调用包装 (RCW) 的引用计数。
参数:
o:要释放的 COM 对象。
返回结果:与 o 关联的 RCW 的引用计数的新值。此值通常为零,因为 RCW 只保留对包装的 COM 对象的一个引用,而不管调用它的托管客户端的数量如何。
异常:
T:System.ArgumentException: o 不是有效的 COM 对象。
T:System.NullReferenceException: o is null.

public static int ReleaseComObject(object o);


摘要:分配一个非托管二进制字符串 (BSTR),并将托管 System.Security.SecureString 对象的内容复制到其中。
参数:
s:要复制的托管对象。
返回结果:非托管内存中 s 参数复制到的地址,如果提供了 null 对象,则为 0。
异常:
T:System.ArgumentNullException:s 参数为 null。
T:System.NotSupportedException:当前计算机未运行 Windows 2000 Service Pack 3 或更高版本。
T:System.OutOfMemoryException:可用内存不足。
[CLSCompliant(false)]

public static IntPtr SecureStringToBSTR(SecureString s);


摘要:将托管 System.Security.SecureString 对象的内容复制到从非托管 COM 任务分配器分配的内存块。
参数:
s:要复制的托管对象。
返回结果:非托管内存中 s 参数复制到的地址,如果提供了 null 对象,则为 0。
异常:
T:System.ArgumentNullException:s 参数为 null。
T:System.NotSupportedException:当前计算机未运行 Windows 2000 Service Pack 3 或更高版本。
T:System.OutOfMemoryException:可用内存不足。
[CLSCompliant(false)]

public static IntPtr SecureStringToCoTaskMemAnsi(SecureString s);


摘要:将托管 System.Security.SecureString 对象的内容复制到从非托管 COM 任务分配器分配的内存块。
参数:
s:要复制的托管对象。
返回结果:非托管内存中 s 参数复制到的地址,如果提供了 null 对象,则为 0。
异常:
T:System.ArgumentNullException:s 参数为 null。
T:System.NotSupportedException:当前计算机未运行 Windows 2000 Service Pack 3 或更高版本。
T:System.OutOfMemoryException:可用内存不足。
[CLSCompliant(false)]

public static IntPtr SecureStringToCoTaskMemUnicode(SecureString s);


摘要:将受管系统的内容复制到非托管内存中,并在复制时转换为 ANSI 格式。
参数:
s:要复制的托管对象。
返回结果:非托管内存中将 s 参数复制到的地址,如果提供了 null 对象,则为 0。
异常:
T:System.ArgumentNullException:s 参数为 null。
T:System.NotSupportedException:当前计算机未运行 Windows 2000 Service Pack 3 或更高版本。
T:System.OutOfMemoryException:可用内存不足。
[CLSCompliant(false)]

public static IntPtr SecureStringToGlobalAllocAnsi(SecureString s);


摘要:将受管系统的内容复制到非受管内存中。
参数:
s:要复制的托管对象。
返回结果:在非托管内存中,s 被复制到的地址,如果 s 是长度为 0 的 System.Security.SecureString 对象,则为 0。
异常:
T:System.ArgumentNullException:s 参数为 null。
T:System.NotSupportedException:当前计算机未运行 Windows 2000 Service Pack 3 或更高版本。
T:System.OutOfMemoryException:可用内存不足。
[CLSCompliant(false)]

public static IntPtr SecureStringToGlobalAllocUnicode(SecureString s);


摘要:设置指定 COM 对象中指定键所引用的数据。
参数:
obj:用于存储数据的 COM 对象。
key:COM 对象的内部哈希表中用于存储数据的键。
数据:要设置的数据。
返回结果: 如果数据设置成功,则为 true;否则,为假。
异常:
T:System.ArgumentNullException: obj is null.-or- 键为空。
T:System.ArgumentException: obj 不是 COM 对象。-or- obj 是一个 Windows 运行时对象。

public static bool SetComObjectData(object obj, object key, object? data);


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 返回非托管类型的大小(以字节为单位)。
类型参数:
T:要返回其大小的类型。
返回结果:由 T 泛型类型参数指定的类型的大小(以字节为单位)。

public static int SizeOf();


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 返回指定类型的对象的非托管大小(以字节为单位)。
参数:
结构:要返回其大小的对象。
类型参数:
T:结构参数的类型。
返回结果:非托管代码中指定对象的大小(以字节为单位)。
异常:
T:System.ArgumentNullException:结构参数为 null。

public static int SizeOf(T structure);


摘要:返回对象的非托管大小(以字节为单位)。
参数:
结构:要返回其大小的对象。
返回结果:非托管代码中指定对象的大小。
异常:
T:System.ArgumentNullException:结构参数为 null。
[EditorBrowsable(EditorBrowsableState.Never)]

public static int SizeOf(object structure);


摘要:返回非托管类型的大小(以字节为单位)。
参数:
t:要返回其大小的类型。
返回结果:非托管代码中指定类型的大小。
异常:
T:System.ArgumentException:t 参数是泛型类型定义。
T:System.ArgumentNullException:t 参数为 null。
[EditorBrowsable(EditorBrowsableState.Never)]

public static int SizeOf(Type t);


摘要:分配一个 BSTR 并将托管系统的内容复制到其中。
参数:
s:要复制的托管字符串。
返回结果:指向 BSTR 的非托管指针,如果 s 为 null,则返回 0。
异常:
T:System.OutOfMemoryException:可用内存不足。
T:System.ArgumentOutOfRangeException:s 的长度超出范围。

public static IntPtr StringToBSTR(string? s);


摘要:将受管 System.String 的内容复制到从非托管 COM 任务分配器分配的内存块。
参数:
s:要复制的托管字符串。
返回结果:一个整数,表示指向为字符串分配的内存块的指针,如果 s 为 null,则为 0。
异常:
T:System.OutOfMemoryException:可用内存不足。
T:System.ArgumentOutOfRangeException:s 参数超过操作系统允许的最大长度。

public static IntPtr StringToCoTaskMemAnsi(string? s);


摘要:将受管 System.String 的内容复制到从非托管 COM 任务分配器分配的内存块。
参数:
s:要复制的托管字符串。
返回结果:分配的内存块,如果 s 为空,则返回 0。
异常:
T:System.OutOfMemoryException:可用内存不足。
T:System.ArgumentOutOfRangeException:s 的长度超出范围。

public static IntPtr StringToCoTaskMemAuto(string? s);


摘要:将受管 System.String 的内容复制到从非托管 COM 任务分配器分配的内存块。
参数:
s:要复制的托管字符串。
返回结果:一个整数,表示指向为字符串分配的内存块的指针,如果 s 为 null,则为 0。
异常:
T:System.ArgumentOutOfRangeException:s 参数超过操作系统允许的最大长度。
T:System.OutOfMemoryException:可用内存不足。

public static IntPtr StringToCoTaskMemUni(string? s);

参数:
s:

public static IntPtr StringToCoTaskMemUTF8(string? s);


摘要:将受管 System.String 的内容复制到非托管内存中,在复制时转换为 ANSI 格式。
参数:
s:要复制的托管字符串。
返回结果:非托管内存中将 s 复制到的地址,如果 s 为 null,则为 0。
异常:
T:System.OutOfMemoryException:可用内存不足。
T:System.ArgumentOutOfRangeException:s 参数超过操作系统允许的最大长度。

public static IntPtr StringToHGlobalAnsi(string? s);


摘要:将受管 System.String 的内容复制到非托管内存中,如果需要,可转换为 ANSI 格式。
参数:
s:要复制的托管字符串。
返回结果:非托管内存中将字符串复制到的地址,如果 s 为 null,则为 0。
异常:
T:System.OutOfMemoryException:可用内存不足。

public static IntPtr StringToHGlobalAuto(string? s);


摘要:将受管系统的内容复制到非受管内存中。
参数:
s:要复制的托管字符串。
返回结果:非托管内存中将 s 复制到的地址,如果 s 为 null,则为 0。
异常:
T:System.OutOfMemoryException:该方法无法分配足够的本机堆内存。
T:System.ArgumentOutOfRangeException:s 参数超过操作系统允许的最大长度。

public static IntPtr StringToHGlobalUni(string? s);


摘要:[在 .NET Framework 4.5.1 及更高版本中受支持] 将数据从指定类型的托管对象封送到非托管内存块。
参数:
结构:保存要封送处理的数据的托管对象。该对象必须是格式化类的结构或实例。
ptr:指向非托管内存块的指针,必须在调用此方法之前分配该内存块。
fDeleteOld:在 ptr 参数上调用 System.Runtime.InteropServices.Marshal.DestroyStructure’'1(System.IntPtr) 方法之前,将此方法调用该方法。该块必须包含有效数据。请注意,当内存块已包含数据时传递 false 可能会导致内存泄漏。
类型参数:
T:托管对象的类型。
异常:
T:System.ArgumentException:结构是一种引用类型,它不是格式化的类。

public static void StructureToPtr([DisallowNull] T structure, IntPtr ptr, bool fDeleteOld);


摘要:将数据从托管对象封送到非托管内存块。
参数:
结构:保存要封送处理的数据的托管对象。此对象必须是格式化类的结构或实例。
ptr:指向非托管内存块的指针,必须在调用此方法之前分配该内存块。
fDeleteOld:在 ptr 参数上调用 System.Runtime.InteropServices.Marshal.DestroyStructure(System.IntPtr,System.Type) 方法,然后再调用此方法。该块必须包含有效数据。请注意,当内存块已包含数据时传递 false 可能会导致内存泄漏。
异常:
T:System.ArgumentException:结构是一种引用类型,它不是格式化的类。 -or- 结构是泛型类型的实例(仅在 .NET Framework 4.5 和更早版本中)。
[EditorBrowsable(EditorBrowsableState.Never)]

public static void StructureToPtr(object structure, IntPtr ptr, bool fDeleteOld);


摘要:引发具有特定失败 HRESULT 值的异常。
参数:
错误代码:对应于所需异常的 HRESULT。

public static void ThrowExceptionForHR(int errorCode);


摘要:基于指定的 IErrorInfo.aspx) 接口,引发具有特定故障 HRESULT 的异常。
参数:
错误代码:对应于所需异常的 HRESULT。
errorInfo:指向 IErrorInfo 接口的指针,提供有关错误的详细信息。您可以指定 IntPtr(0) 以使用当前的 IErrorInfo 接口,或指定 IntPtr(-1) 以忽略当前的 IErrorInfo 接口并仅从错误代码构造异常。

public static void ThrowExceptionForHR(int errorCode, IntPtr errorInfo);


摘要:获取指定数组内指定索引处的元素的地址。
参数:
arr:包含所需元素的数组。
index:所需元素的 arr 参数中的索引。
返回结果: arr 内的索引地址。
[EditorBrowsable(EditorBrowsableState.Never)]

public static IntPtr UnsafeAddrOfPinnedArrayElement(Array arr, int index);


摘要: [在 .NET Framework 4.5.1 及更高版本中受支持] 获取指定类型数组中指定索引处的元素的地址。
参数:
arr:包含所需元素的数组。
index:arr 数组中所需元素的索引。
类型参数:
T:数组的类型。
返回结果: arr 中索引的地址。

public static IntPtr UnsafeAddrOfPinnedArrayElement(T[] arr, int index);


摘要:将单字节值写入非托管内存。
参数:
ptr:非托管内存中要写入的地址。
val:要写入的值。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static void WriteByte(IntPtr ptr, byte val);


摘要:以指定的偏移量将单字节值写入非托管内存。
参数:
ptr:非托管内存中要写入的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static void WriteByte(IntPtr ptr, int ofs, byte val);


摘要:以指定的偏移量将单字节值写入非托管内存。
参数:
ptr:目标对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“WriteByte(Object, Int32, Byte) may be unavailable in future releases.”)]

public static void WriteByte(object ptr, int ofs, byte val);


摘要:以指定的偏移量将 16 位有符号整数值写入非托管内存。
参数:
ptr:目标对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“WriteInt16(Object, Int32, Int16) may be unavailable in future releases.”)]

public static void WriteInt16(object ptr, int ofs, short val);


摘要:以指定的偏移量将 16 位有符号整数值写入非托管内存。
参数:
ptr:目标对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“WriteInt16(Object, Int32, Char) may be unavailable in future releases.”)]

public static void WriteInt16(object ptr, int ofs, char val);


摘要:将 16 位有符号整数值以指定的偏移量写入非托管内存。
参数:
ptr:非托管内存中要写入的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static void WriteInt16(IntPtr ptr, int ofs, short val);


摘要:将一个字符作为 16 位整数值写入非托管内存。
参数:
ptr:非托管内存中要写入的地址。
val:要写入的值。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static void WriteInt16(IntPtr ptr, char val);


摘要:将 16 位整数值写入非托管内存。
参数:
ptr:非托管内存中要写入的地址。
val:要写入的值。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static void WriteInt16(IntPtr ptr, short val);


摘要:以指定的偏移量将 16 位有符号整数值写入非托管内存。
参数:
ptr:本机堆中要写入的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static void WriteInt16(IntPtr ptr, int ofs, char val);


摘要:将 32 位有符号整数值写入非托管内存。
参数:
ptr:非托管内存中要写入的地址。
val:要写入的值。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static void WriteInt32(IntPtr ptr, int val);


摘要:将 32 位有符号整数值以指定的偏移量写入非托管内存。
参数:
ptr:非托管内存中要写入的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static void WriteInt32(IntPtr ptr, int ofs, int val);


摘要:将 32 位有符号整数值写入非托管内存,偏移量为指定偏移量。
参数:
ptr:目标对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“WriteInt32(Object, Int32, Int32) may be unavailable in future releases.”)]

public static void WriteInt32(object ptr, int ofs, int val);


摘要:以指定的偏移量将 64 位有符号整数值写入非托管内存。
参数:
ptr:非托管内存中要写入的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static void WriteInt64(IntPtr ptr, int ofs, long val);


摘要:将 64 位有符号整数值写入非托管内存。
参数:
ptr:非托管内存中要写入的地址。
val:要写入的值。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static void WriteInt64(IntPtr ptr, long val);


摘要:以指定的偏移量将 64 位有符号整数值写入非托管内存。
参数:
ptr:目标对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“WriteInt64(Object, Int32, Int64) may be unavailable in future releases.”)]

public static void WriteInt64(object ptr, int ofs, long val);


摘要:将处理器的本机大小整数值写入非托管内存。
参数:
ptr:目标对象的非托管内存中的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。
T:System.ArgumentException: ptr 是一个 System.Runtime.InteropServices.ArrayWithOffset 对象。此方法不接受 System.Runtime.InteropServices.ArrayWithOffset 参数。
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(“WriteIntPtr(Object, Int32, IntPtr) may be unavailable in future releases.”)]

public static void WriteIntPtr(object ptr, int ofs, IntPtr val);


摘要:将处理器本机大小的整数值写入非托管内存,以指定的偏移量写入非托管内存。
参数:
ptr:非托管内存中要写入的基址。
ofs:一个额外的字节偏移量,在写入之前添加到 ptr 参数中。
val:要写入的值。
异常:
T:System.AccessViolationException:基址 (ptr) 加上偏移字节 (ofs) 会生成空地址或无效地址。

public static void WriteIntPtr(IntPtr ptr, int ofs, IntPtr val);


摘要:将处理器的本机大小整数值写入非托管内存。
参数:
ptr:非托管内存中要写入的地址。
val:要写入的值。
异常:
T:System.AccessViolationException:ptr 不是可识别的格式。-or- ptr 为空。-or- ptr 无效。

public static void WriteIntPtr(IntPtr ptr, IntPtr val);


摘要:释放使用 System.Runtime.InteropServices.Marshal.SecureStringToBSTR(System.Security.SecureString) 方法分配的 BSTR 指针。
参数:
s:BSTR 的地址。

public static void ZeroFreeBSTR(IntPtr s);


摘要:释放使用 System.Runtime.InteropServices.Marshal.SecureStringToCoTaskMemAnsi(System.Security.SecureString) 方法分配的非托管字符串指针。
参数:
s:要释放的非托管字符串的地址。

public static void ZeroFreeCoTaskMemAnsi(IntPtr s);


摘要:释放使用 System.Runtime.InteropServices.Marshal.SecureStringToCoTaskMemUnicode(System.Security.SecureString) 方法分配的非托管字符串指针。
参数:
s:要释放的非托管字符串的地址。

public static void ZeroFreeCoTaskMemUnicode(IntPtr s);

参数:
s:

public static void ZeroFreeCoTaskMemUTF8(IntPtr s);


摘要:释放使用 System.Runtime.InteropServices.Marshal.SecureStringToGlobalAllocAnsi(System.Security.SecureString) 方法分配的非托管字符串指针。
参数:
s:要释放的非托管字符串的地址。

public static void ZeroFreeGlobalAllocAnsi(IntPtr s);


摘要:释放使用 System.Runtime.InteropServices.Marshal.SecureStringToGlobalAllocUnicode(System.Security.SecureString) 方法分配的非托管字符串指针。
参数:
s:要释放的非托管字符串的地址。

public static void ZeroFreeGlobalAllocUnicode(IntPtr s);
  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C# 中调用 C++ DLL 函数的时候,如果函数的参数是 std::string 类型,需要进行一些特殊的处理。因为在 C++ 中,std::string 类型实际上是一个类,而在 C# 中没有对应的类型。 一种解决方案是,将 C++ 函数参数中的 std::string 类型改为 char* 类型,并且增加参数来指定字符串的长度。在 C# 中,可以使用 Marshal 类的各种方法来将字符串转换为 char* 类型,并将字符串的长度传递给 C++ 函数。 下面是一个示例代码,演示了如何在 C# 中调用一个 C++ DLL 函数,该函数的参数类型为 std::string: C++ DLL 函数的代码: ```c++ #include <string> #include <iostream> // 定义一个使用 std::string 作为参数的函数 void printString(std::string str) { std::cout << str << std::endl; } ``` 在 C# 中调用该函数的代码: ```c# using System; using System.Runtime.InteropServices; class Program { // 声明 C++ DLL 函数 [DllImport("MyCppLib.dll", CallingConvention = CallingConvention.Cdecl)] static extern void printString([MarshalAs(UnmanagedType.LPStr)] string str, int length); static void Main(string[] args) { // 要传递给 C++ DLL 函数的字符串 string myString = "Hello, world!"; // 将字符串转换为 char* 类型,并获取字符串的长度 byte[] strBytes = System.Text.Encoding.ASCII.GetBytes(myString); int strLength = strBytes.Length; // 调用 C++ DLL 函数 printString(myString, strLength); } } ``` 在 C# 中,使用 [MarshalAs(UnmanagedType.LPStr)] 特性将 C++ 函数参数中的 std::string 类型转换为 char* 类型,使用 System.Text.Encoding.ASCII.GetBytes() 方法将字符串转换为 byte[] 类型,并使用该数组的长度作为字符串的长度参数传递给 C++ 函数。 希望这个示例代码对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值