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
Наследование
UnmanagedType
Атрибуты

Поля

Имя Значение Описание
Bool 2

4-байтовое логическое значение (true != 0, false = 0). Это тип BOOL Win32.

I1 3

Целое число со знаком 1 байта. Этот элемент можно использовать для преобразования логического значения в 1-байт, стиль bool C (true = 1, false = 0).

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 вместо типа Decimal.

BStr 19

Строка символов Юникода, которая является префиксом двойного байта длины. Этот элемент можно использовать, который является строкой по умолчанию в COM, в типе String данных.

LPStr 20

Одна байтовая строка символов ANSI, завершающаяся значением NULL. Этот элемент можно использовать в типах String данных и StringBuilder типах данных.

LPWStr 21

2-байтовая строка символов Юникода, завершающаяся значением NULL. Нельзя использовать LPWStr значение с неуправляемой строкой, если не была создана строка с помощью неуправляемой CoTaskMemAlloc функции.

LPTStr 22

Строка символов Юникода. Это значение поддерживается только для вызова платформы, а не для COM-взаимодействия, так как экспорт строки типа LPTStr не поддерживается.

ByValTStr 23

Используется для встроенных массивов символов фиксированной длины, которые отображаются в структуре. ByValTStr типы ведут себя как строки типа C, фиксированного размера внутри структуры (например, char s[5]). Тип символа, используемый с ByValTStr , определяется CharSet аргументом атрибута StructLayoutAttribute , примененного к содержащей структуре. Всегда используйте SizeConst поле для указания размера массива.

IUnknown 25

Указатель COM IUnknown . Этот элемент можно использовать в типе Object данных.

IDispatch 26

Указатель COM IDispatch (Object в Microsoft Visual Basic 6.0).

Struct 27

Variant, который используется для маршалирования управляемых управляемых классов и типов значений.

Interface 28

Указатель интерфейса COM. Интерфейс Guid получается из метаданных класса. Используйте этот член, чтобы указать точный тип интерфейса или тип интерфейса по умолчанию, если применить его к классу. Этот элемент создает то же поведение, что IUnknown и при применении его к типу Object данных.

SafeArray 29

SafeArrayэто самоописывющий массив, который несет тип, ранг и границы связанных данных массива. Этот элемент можно использовать с SafeArraySubType полем для переопределения типа элемента по умолчанию.

ByValArray 30

Value Если для свойства задано ByValArrayзначение, SizeConst поле должно быть задано, чтобы указать количество элементов в массиве. Поле ArraySubType может дополнительно содержать UnmanagedType элементы массива, если необходимо различать типы строк. Это UnmanagedType можно использовать только в массиве, элементы которого отображаются как поля в структуре.

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

Строка Юникода char с префиксом длины. Этот элемент BSTR редко используется.

VariantBool 37

2-байтовый, определяемый OLE тип VARIANT_BOOL (true = -1, false = 0).

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 и различных других типов.

Дополнительные сведения см. в разделе Взаимодействие с неуправляемым кодом.

Применяется к

См. также раздел