UnmanagedType 列舉
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
識別如何封送處理參數或欄位至 Unmanaged 程式碼。
public enum class UnmanagedType
public enum UnmanagedType
[System.Serializable]
public enum UnmanagedType
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum UnmanagedType
type UnmanagedType =
[<System.Serializable>]
type UnmanagedType =
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type UnmanagedType =
Public Enum UnmanagedType
- 繼承
- 屬性
欄位
AnsiBStr | 35 | 固定長度、單一位元組的 ANSI 字元字串。 您可以在 String 資料類型上使用這個成員。 |
AsAny | 40 | 動態 (Dynamic) 類型,在執行階段判斷物件的類型,並封送處理物件為該類型。 這個成員僅對平台叫用方法有效。 |
Bool | 2 | 4 位元組的布林值 ( |
BStr | 19 | 固定長度雙位元組的 Unicode 字元字串。 您可以在 String 資料類型上使用這個成員,這是 COM 中的預設字串。 |
ByValArray | 30 | 將 Value 屬性設為 |
ByValTStr | 23 | 使用於出現在結構中的內嵌 (Inline) 固定長度字元陣列。
|
Currency | 15 | 貨幣類型。 在 Decimal 上用來將十進位值封送處理為 COM 貨幣類型,而不是成為 |
CustomMarshaler | 44 | 搭配 MarshalType 或 MarshalTypeRef 欄位使用時,指定自訂封送處理器的類別。 MarshalCookie 欄位可用來將其他資訊傳遞給自訂封送處理器。 您可以將這個成員用於參考類型。 這個成員僅適用於參數和傳回值。 無法在欄位中使用。 |
Error | 45 | |
FunctionPtr | 38 | 整數,可當做 C-style 函式指標使用。 您可以在 Delegate 資料類型或自 Delegate 繼承的類型上使用這個成員。 |
HString | 47 | Windows 執行時間字串。 您可以在 String 資料類型上使用這個成員。 .NET 5 已移除 WinRT 的內建支援。 如需因 應措施,請參閱先前內建的支持類型 。 |
I1 | 3 | 1 位元帶正負號的整數。 您可以使用這個成員,將布林值轉換為 1 位元組、C-style |
I2 | 5 | 2 位元帶正負號的整數。 |
I4 | 7 | 4 位元帶正負號的整數。 |
I8 | 9 | 8 位元帶正負號的整數。 |
IDispatch | 26 | COM |
IInspectable | 46 | Windows 運行時間介面指標。 您可以在 Object 資料類型上使用這個成員。 .NET 5 已移除 WinRT 的內建支援。 |
Interface | 28 | COM 的介面指標。 介面的 Guid 是從類別中繼資料取得。 使用這個成員指定如果套用至類別時的正確介面類型或預設介面類型。 當您將這個成員套用至 Object 資料類型時,它會產生與 IUnknown 相同的行為。 |
IUnknown | 25 | COM |
LPArray | 42 | 指向 C-style 陣列第一個項目的指標。 當從 Managed 程式碼封送處理至 Unmanaged 程式碼時,陣列的長度是由 Managed 陣列的長度來判斷。 從 Unmanaged 程式碼封送處理至 Managed 程式碼時,會從 SizeConst 和 SizeParamIndex 欄位判斷陣列的長度,在需要區別字串類型時,也可以選擇是否要在後面加上陣列中元素的 Unmanaged 類型。 |
LPStr | 20 | 單一位元組、以 Null 結束的 ANSI 字元字串。 您可以在 String 和 StringBuilder 資料類型上使用這個成員。 |
LPStruct | 43 | C-style 結構的指標,您用來封送處理 Managed 格式化類別。 這個成員僅對平台叫用方法有效。 |
LPTStr | 22 | Unicode 字元字串。 因為不支援匯出 |
LPUTF8Str | 48 | 指向以 UTF-8 編碼字串的指標。 |
LPWStr | 21 | 2 位元組、以 Null 結束的 Unicode 字元字串。 除非您使用非受控的 |
R4 | 11 | 4 位元組浮點數。 |
R8 | 12 | 8 位元組浮點數。 |
SafeArray | 29 |
|
Struct | 27 | VARIANT,用來封送處理 Managed 格式化類別和實值類型。 |
SysInt | 31 | 平台相依的帶正負號整數:在 32 位元 Windows 上為 4 位元組,在 64 位元 Windows 上為 8 位元組。 |
SysUInt | 32 | 平台相依的不帶正負號整數:在 32 位元 Windows 上為 4 位元組,在 64 位元 Windows 上為 8 位元組。 |
TBStr | 36 | 長度前置詞 Unicode |
U1 | 4 | 1 位元組不帶正負號的整數。 |
U2 | 6 | 2 位元組不帶正負號的整數。 |
U4 | 8 | 4 位元組不帶正負號的整數。 |
U8 | 10 | 8 位元不帶正負號的整數。 |
VariantBool | 37 | 2 位元組、OLE 定義的 VARIANT_BOOL 類型 ( |
VBByRefStr | 34 | 值,這個值可讓 Visual Basic 變更 Unmanaged 程式碼中的字串,並且讓結果反映在 Managed 程式碼中。 只有平台叫用支援這個值。 |
範例
下列代碼段示範如何在Managed原始程式碼中宣告 COM元件所實作的 Unmanaged 介面。 屬性 System.Runtime.InteropServices.ComImportAttribute 可防止 IMyStorage
介面匯出回供 COM 使用。 (COM 用戶端應該直接使用現有的 COM 元件。) 在此範例中, MarshalAsAttribute 會指定數 UnmanagedType 個成員,代表原始 COM 介面所使用的類型。
using namespace System;
using namespace System::Runtime::InteropServices;
// If you do not have a type library for an interface
// you can redeclare it using ComImportAttribute.
// This is how the interface would look in an idl file.
//[
//object,
//uuid("73EB4AF8-BE9C-4b49-B3A4-24F4FF657B26"),
//dual, helpstring("IMyStorage Interface"),
//pointer_default(unique)
//]
//interface IMyStorage : IDispatch
//{
// [id(1)]
// HRESULT GetItem([in] BSTR bstrName, [out, retval] IDispatch ** ppItem);
// [id(2)]
// HRESULT GetItems([in] BSTR bstrLocation, [out] SAFEARRAY(VARIANT)* pItems);
// [id(3)]
// HRESULT GetItemDescriptions([in] BSTR bstrLocation, [out] SAFEARRAY(VARIANT) ** ppItems);
// [id(4), propget]
// HRESULT get_IsEmpty([out, retval] BOOL * pfEmpty);
//};
// This is the managed declaration.
[ComImport]
[Guid("73EB4AF8-BE9C-4b49-B3A4-24F4FF657B26")]
interface class IMyStorage
{
[DispId(1)]
Object^ GetItem( [In,MarshalAs(UnmanagedType::BStr)]String^ bstrName );
//[return : MarshalAs(UnmanagedType::Interface)]
[DispId(2)]
void GetItems( [In,MarshalAs(UnmanagedType::BStr)]String^ bstrLocation, [Out,MarshalAs(UnmanagedType::SafeArray,
SafeArraySubType=VarEnum::VT_VARIANT)]array<Object^>^Items );
[DispId(3)]
void GetItemDescriptions( [In]String^ bstrLocation, [In,Out,MarshalAs(UnmanagedType::SafeArray)]array<Object^>^varDescriptions );
property bool IsEmpty
{
[DispId(4)]
[returnvalue:MarshalAs(UnmanagedType::VariantBool)]
bool get();
}
};
using System;
using System.Runtime.InteropServices;
namespace MyModule
{
// If you do not have a type library for an interface
// you can redeclare it using ComImportAttribute.
// This is how the interface would look in an idl file.
//[
//object,
//uuid("73EB4AF8-BE9C-4b49-B3A4-24F4FF657B26"),
//dual, helpstring("IMyStorage Interface"),
//pointer_default(unique)
//]
//interface IMyStorage : IDispatch
//{
// [id(1)]
// HRESULT GetItem([in] BSTR bstrName, [out, retval] IDispatch ** ppItem);
// [id(2)]
// HRESULT GetItems([in] BSTR bstrLocation, [out] SAFEARRAY(VARIANT)* pItems);
// [id(3)]
// HRESULT GetItemDescriptions([in] BSTR bstrLocation, [out] SAFEARRAY(VARIANT) ** ppItems);
// [id(4), propget]
// HRESULT get_IsEmpty([out, retval] BOOL * pfEmpty);
//};
// This is the managed declaration.
[ComImport]
[Guid("73EB4AF8-BE9C-4b49-B3A4-24F4FF657B26")]
public interface IMyStorage
{
[DispId(1)]
[return: MarshalAs(UnmanagedType.Interface)]
object GetItem([In, MarshalAs(UnmanagedType.BStr)] String bstrName);
[DispId(2)]
void GetItems([In, MarshalAs(UnmanagedType.BStr)] String bstrLocation,
[Out, MarshalAs( UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_VARIANT )] out Object[] Items);
[DispId(3)]
void GetItemDescriptions([In] String bstrLocation,
[In, Out, MarshalAs(UnmanagedType.SafeArray)] ref Object[] varDescriptions);
bool IsEmpty
{
[DispId(4)]
[return: MarshalAs(UnmanagedType.VariantBool)]
get;
}
}
}
Imports System.Runtime.InteropServices
Module MyModule
' If you do not have a type library for an interface
' you can redeclare it using ComImportAttribute.
' This is how the interface would look in an idl file.
'[
'object,
'uuid("73EB4AF8-BE9C-4b49-B3A4-24F4FF657B26"),
'dual, helpstring("IMyStorage Interface"),
'pointer_default(unique)
']
'interface IMyStorage : IDispatch
'{
' [id(1)]
' HRESULT GetItem([in] BSTR bstrName, [out, retval] IDispatch ** ppItem);
' [id(2)]
' HRESULT GetItems([in] BSTR bstrLocation, [out] SAFEARRAY(VARIANT)* pItems);
' [id(3)]
' HRESULT GetItemDescriptions([in] BSTR bstrLocation, [out] SAFEARRAY(VARIANT) ** ppItems);
' [id(4), propget]
' HRESULT get_IsEmpty([out, retval] BOOL * pfEmpty);
'};
' This is the managed declaration.
<ComImport(), Guid("73EB4AF8-BE9C-4b49-B3A4-24F4FF657B26")> _
Public Interface IMyStorage
<DispId(1)> _
Function GetItem(<InAttribute(), MarshalAs(UnmanagedType.BStr)> ByVal bstrName As String) _
As <MarshalAs(UnmanagedType.Interface)> Object
<DispId(2)> _
Function GetItems(<InAttribute(), MarshalAs(UnmanagedType.BStr)> ByVal bstrLocation As String, _
<OutAttribute(), MarshalAs(UnmanagedType.SafeArray, SafeArraySubType := VarEnum.VT_VARIANT)> _
ByVal Items() As Object)
<DispId(3)> _
Function GetItemDescriptions(<InAttribute()> ByVal bstrLocation As String, _
<InAttribute(), OutAttribute(), _
MarshalAs(UnmanagedType.SafeArray)> ByRef varDescriptions() As Object)
<DispId(4)> _
ReadOnly Property IsEmpty(<MarshalAs(UnmanagedType.VariantBool)> ByVal bEmpty As Boolean)
End Interface
End Module
備註
使用 UnmanagedType 列舉搭配 System.Runtime.InteropServices.MarshalAsAttribute 屬性,以指定與 Unmanaged 程式代碼互操作期間如何封送處理類型。 您可以使用這個列舉,使用簡單實值類型封送處理程式代碼, (I1、I2、I4、I8、R4、R8、U2、U4 和 U8) 、.NET Framework 中無法使用的 Unmanaged 型別,以及各種其他類型。
如需詳細資訊,請參閱與 Unmanaged 程式碼互通。