UnmanagedType Перечисление
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяет, как маршалировать параметры или поля в неуправляемый код.
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
- Наследование
- Атрибуты
Поля
| Имя | Значение | Описание |
|---|---|---|
| Bool | 2 | 4-байтовое логическое значение ( |
| I1 | 3 | Целое число со знаком 1 байта. Этот элемент можно использовать для преобразования логического значения в 1-байт, стиль |
| U1 | 4 | Целое число без знака 1 байта. |
| I2 | 5 | 2-байтовое целое число со знаком. |
| U2 | 6 | Целое число без знака 2 байта. |
| I4 | 7 | Целое число со знаком 4 байта. |
| U4 | 8 | Целое число без знака 4 байта. |
| I8 | 9 | Целое число со знаком 8 байтов. |
| U8 | 10 | Целое число без знака 8 байтов. |
| R4 | 11 | Число с плавающей запятой 4 байта. |
| R8 | 12 | Число с плавающей запятой 8 байтов. |
| Currency | 15 | Тип валюты. Используется для Decimal маршалирования десятичного значения в виде типа валюты COM вместо типа |
| BStr | 19 | Строка символов Юникода, которая является префиксом двойного байта длины. Этот элемент можно использовать, который является строкой по умолчанию в COM, в типе String данных. |
| LPStr | 20 | Одна байтовая строка символов ANSI, завершающаяся значением NULL. Этот элемент можно использовать в типах String данных и StringBuilder типах данных. |
| LPWStr | 21 | 2-байтовая строка символов Юникода, завершающаяся значением NULL. Нельзя использовать |
| LPTStr | 22 | Строка символов Юникода. Это значение поддерживается только для вызова платформы, а не для COM-взаимодействия, так как экспорт строки типа |
| ByValTStr | 23 | Используется для встроенных массивов символов фиксированной длины, которые отображаются в структуре.
|
| IUnknown | 25 | Указатель COM |
| IDispatch | 26 | Указатель COM |
| Struct | 27 | Variant, который используется для маршалирования управляемых управляемых классов и типов значений. |
| Interface | 28 | Указатель интерфейса COM. Интерфейс Guid получается из метаданных класса. Используйте этот член, чтобы указать точный тип интерфейса или тип интерфейса по умолчанию, если применить его к классу. Этот элемент создает то же поведение, что IUnknown и при применении его к типу Object данных. |
| SafeArray | 29 | — |
| ByValArray | 30 |
Value Если для свойства задано |
| SysInt | 31 | Зависимое от платформы целое число со знаком: 4 байта на 32-разрядных Windows, 8 байтов на 64-разрядных Windows. |
| SysUInt | 32 | Зависимое от платформы целое число без знака: 4 байта на 32-разрядных Windows, 8 байтов на 64-разрядных Windows. |
| VBByRefStr | 34 | Значение, позволяющее Visual Basic изменять строку в неуправляемом коде и отражать результаты в управляемом коде. Это значение поддерживается только для вызова платформы. |
| AnsiBStr | 35 | Строка символов ANSI, которая является префиксной длиной однобайта. Этот элемент можно использовать в типе String данных. |
| TBStr | 36 | Строка Юникода |
| VariantBool | 37 | 2-байтовый, определяемый OLE тип VARIANT_BOOL ( |
| FunctionPtr | 38 | Целое число, которое можно использовать в качестве указателя функции в стиле C. Этот элемент можно использовать для Delegate типа данных или типа, наследуемого от типа Delegate. |
| AsAny | 40 | Динамический тип, определяющий тип объекта во время выполнения и маршалирует объект в качестве этого типа. Этот член действителен только для методов вызова платформы. |
| LPArray | 42 | Указатель на первый элемент массива стилей C. При маршалинге из управляемого в неуправляемый код длина массива определяется длиной управляемого массива. При маршалинге из неуправляемого в управляемый код длина массива определяется из SizeConst полей и SizeParamIndex полей, за которым следует неуправляемый тип элементов в массиве, если необходимо различать типы строк. |
| LPStruct | 43 | Указатель на структуру стиля C, используемую для маршалирования управляемых форматированных классов. Этот член действителен только для методов вызова платформы. |
| CustomMarshaler | 44 | Задает пользовательский класс маршалера при использовании с полем или MarshalType полемMarshalTypeRef. Поле MarshalCookie можно использовать для передачи дополнительных сведений пользовательскому маршалеру. Этот элемент можно использовать для любого ссылочного типа. Этот элемент действителен только для параметров и возвращаемых значений. Его нельзя использовать в полях. |
| Error | 45 | Собственный тип, связанный с I4 или и U4 который приводит к экспорту параметра в виде HRESULT в экспортируемой библиотеке типов. |
| IInspectable | 46 | Указатель интерфейса среда выполнения Windows. Этот элемент можно использовать в типе Object данных. Строеная поддержка WinRT была удалена в .NET 5. |
| HString | 47 | Строка среда выполнения Windows. Этот элемент можно использовать в типе String данных. Строеная поддержка WinRT была удалена в .NET 5. См. ранее встроенные поддерживаемые типы для обходного решения. |
| LPUTF8Str | 48 | Указатель на строку в кодировке UTF-8. |
Примеры
В следующем фрагменте кода показано, как объявить в управляемом исходном коде неуправляемый интерфейс, реализованный компонентом COM. Атрибут 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 атрибутом, чтобы указать, как типы маршалируются во время взаимодействия с неуправляемым кодом. Это перечисление можно использовать для маршалирования кода с помощью простых типов значений (I1, I2, I4, I8, R4, R8, U2, U4 и U8), неуправляемых типов, недоступных в .NET Framework и различных других типов.
Дополнительные сведения см. в разделе Взаимодействие с неуправляемым кодом.