Поделиться через


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
Атрибуты

Поля

AnsiBStr 35

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

AsAny 40

Динамический тип, который определяет тип объекта во время выполнения и маршалирует объект как объекта данного типа. Этот член является допустимым только для методов вызова неуправляемого кода.

Bool 2

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

BStr 19

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

ByValArray 30

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

ByValTStr 23

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

Currency 15

Тип валюты. Используется в Decimal для маршалинга десятичного значения как типа денежной единицы COM, вместо Decimal.

CustomMarshaler 44

Задает класс настраиваемых модулей маршалинга при использовании с полем MarshalType или MarshalTypeRef. Поле MarshalCookie можно использовать для передачи дополнительных сведений настраиваемому модулю маршалинга. Этот элемент можно использовать для всех ссылочных типов. Этот член допустим только для параметров и возвращаемых значений. Его нельзя использовать в полях.

Error 45

Собственный тип, связанный с I4 или U4, который приводит к экспорту параметра как значения HRESULT в экспортированной библиотеке типов.

FunctionPtr 38

Целое число, которое может использоваться как указатель функции в стиле языка С. Этот элемент можно использовать для типа данных Delegate или типа, наследуемого от Delegate.

HString 47

Строка среды выполнения Windows. Этот элемент можно использовать для типа данных String. Встроенная поддержка WinRT была удалена в .NET 5. Обходной путь см. в статье Ранее встроенные поддерживаемые типы.

I1 3

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

I2 5

2-байтовое целое число со знаком.

I4 7

4-байтовое целое число со знаком.

I8 9

8-байтовое целое число со знаком.

IDispatch 26

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

IInspectable 46

Указатель интерфейса среды выполнения Windows. Этот элемент можно использовать для типа данных Object. Встроенная поддержка WinRT была удалена в .NET 5.

Interface 28

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

IUnknown 25

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

LPArray 42

Указатель на первый элемент массива в стиле языка C. При маршалинге из управляемого кода в неуправляемый длина массива определяется исходя из длины управляемого массива. При маршалинге из неуправляемого кода в управляемый длина массива определяется исходя из значений полей SizeConst и SizeParamIndex, за которыми, если требуется различать тип строк, следует тип элементов неуправляемого массива.

LPStr 20

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

LPStruct 43

Указатель на структуру в стиле языка C, используемую для маршалинга управляемых форматируемых классов. Этот член является допустимым только для методов вызова неуправляемого кода.

LPTStr 22

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

LPUTF8Str 48

Указатель на строку в кодировке UTF-8.

LPWStr 21

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

R4 11

4-байтовое число с плавающей запятой.

R8 12

8-байтовое число с плавающей запятой.

SafeArray 29

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

Struct 27

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

SysInt 31

Платформозависимое знаковое целое число: 4 байта в 32-разрядной Windows, 8 байт в 64-разрядной Windows.

SysUInt 32

Платформозависимое знаковое целое число без знака: 4 байта в 32-разрядной Windows, 8 байт в 64-разрядной Windows.

TBStr 36

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

U1 4

1-байтовое целое число без знака.

U2 6

2-байтовое целое число без знака.

U4 8

4-байтовое целое число без знака.

U8 10

8-байтовое целое число без знака.

VariantBool 37

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

VBByRefStr 34

Значение, позволяющее Visual Basic изменять строку в неуправляемом коде и получать результаты, отраженные в управляемом коде. Это значение поддерживается только для вызова неуправляемого кода.

Примеры

В следующем фрагменте кода показано, как объявить в управляемом исходном коде неуправляемый интерфейс, реализованный компонентом 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, и различных типов.

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

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

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