UnmanagedType Wyliczenie

Definicja

Określa sposób marshalowania parametrów lub pól na kod niezarządzany.

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
Dziedziczenie
UnmanagedType
Atrybuty

Pola

AnsiBStr 35

Ciąg znaków ANSI, który jest poprzedzony prefiksem pojedynczy bajt. Możesz użyć tego elementu członkowskiego w typie String danych.

AsAny 40

Typ dynamiczny określający typ obiektu w czasie wykonywania i marshalsuje obiekt jako ten typ. Ten element członkowski jest prawidłowy tylko dla metod wywoływanych przez platformę.

Bool 2

Wartość logiczna 4-bajtowa (true != 0, false = 0). Jest to typ BOOL Win32.

BStr 19

Ciąg znaków Unicode, który jest poprzedzony podwójnym bajtem o długości. Możesz użyć tego elementu członkowskiego, który jest ciągiem domyślnym w modelu COM, w typie String danych.

ByValArray 30

Value Gdy właściwość jest ustawiona na ByValArraywartość , SizeConst należy ustawić pole, aby wskazać liczbę elementów w tablicy. Pole ArraySubType może opcjonalnie zawierać UnmanagedType elementy tablicy, gdy konieczne jest rozróżnienie między typami ciągów. Tej funkcji można używać UnmanagedType tylko w tablicy, której elementy są wyświetlane jako pola w strukturze.

ByValTStr 23

Służy do liniowych tablic znaków o stałej długości, które pojawiają się w strukturze. ByValTStr typy zachowują się jak ciągi typu C, o stałym rozmiarze wewnątrz struktury (na przykład char s[5]). Typ znaku używany z elementem ByValTStr jest określany przez CharSet argument atrybutu StructLayoutAttribute zastosowanego do struktury zawierającej. Zawsze używaj SizeConst pola, aby wskazać rozmiar tablicy.

Currency 15

Typ waluty. Służy do Decimal marshalingu wartości dziesiętnej jako typu waluty COM zamiast jako Decimal.

CustomMarshaler 44

Określa niestandardową klasę marshalera, gdy jest używana z polem MarshalType lub MarshalTypeRef . Pole MarshalCookie może służyć do przekazywania dodatkowych informacji do marshalera niestandardowego. Możesz użyć tego elementu członkowskiego w dowolnym typie referencyjnym. Ten element członkowski jest prawidłowy tylko dla parametrów i zwracanych wartości. Nie można jej używać w polach.

Error 45

Natywny typ skojarzony z elementem I4 lub U4 i, który powoduje wyeksportowanie parametru jako HRESULT w wyeksportowanej bibliotece typów.

FunctionPtr 38

Liczba całkowita, która może być używana jako wskaźnik funkcji w stylu C. Możesz użyć tego elementu członkowskiego dla Delegate typu danych lub typu dziedziczonego z klasy Delegate.

HString 47

Ciąg środowisko wykonawcze systemu Windows. Możesz użyć tego elementu członkowskiego w typie String danych. Wbudowana obsługa winRT została usunięta na platformie .NET 5. Aby obejść ten problem, zobacz Wcześniej wbudowane typy obsługiwane .

I1 3

Liczba całkowita ze znakiem 1 bajtu. Możesz użyć tego elementu członkowskiego, aby przekształcić wartość logiczną w 1-bajtowy styl C bool (true = 1, false = 0).

I2 5

Liczba całkowita ze znakiem 2 bajtów.

I4 7

4-bajtowa liczba całkowita ze znakiem.

I8 9

8-bajtowa liczba całkowita ze znakiem.

IDispatch 26

Wskaźnik COM IDispatch (Object w programie Microsoft Visual Basic 6.0).

IInspectable 46

Wskaźnik interfejsu środowisko wykonawcze systemu Windows. Możesz użyć tego elementu członkowskiego w typie Object danych. Wbudowana obsługa winRT została usunięta na platformie .NET 5.

Interface 28

Wskaźnik interfejsu COM. Interfejs Guid jest uzyskiwany z metadanych klasy. Użyj tego elementu członkowskiego, aby określić dokładny typ interfejsu lub domyślny typ interfejsu, jeśli zastosujesz go do klasy. Ten element członkowski generuje takie samo zachowanie, jak IUnknown w przypadku zastosowania go do Object typu danych.

IUnknown 25

Wskaźnik COM IUnknown . Możesz użyć tego elementu członkowskiego w typie Object danych.

LPArray 42

Wskaźnik do pierwszego elementu tablicy w stylu C. Podczas marshalingu z zarządzanego do niezarządzanego kodu długość tablicy jest określana przez długość zarządzanej tablicy. Podczas marshalingu z niezarządzanego do kodu zarządzanego długość tablicy jest określana z SizeConst pól i SizeParamIndex , opcjonalnie następuje niezarządzany typ elementów w tablicy, gdy konieczne jest rozróżnienie między typami ciągów.

LPStr 20

Ciąg znaków ANSI zakończony pojedynczym bajtem o wartości null. Możesz użyć tego elementu członkowskiego w typach String danych i .StringBuilder

LPStruct 43

Wskaźnik do struktury stylu C używanej do marshalowania zarządzanych klas sformatowanych. Ten element członkowski jest prawidłowy tylko w przypadku metod wywoływania platformy.

LPTStr 22

Ciąg znaków Unicode. Ta wartość jest obsługiwana tylko w przypadku wywołania platformy, a nie międzyoperacyjnej modelu COM, ponieważ eksportowanie ciągu typu LPTStr nie jest obsługiwane.

LPUTF8Str 48

Wskaźnik do zakodowanego ciągu UTF-8.

LPWStr 21

Ciąg znaków Unicode zakończony 2 bajtami o wartości null. Nie można użyć LPWStr wartości z ciągiem niezarządzanym, chyba że ciąg został utworzony przy użyciu funkcji niezarządzanej CoTaskMemAlloc .

R4 11

Liczba zmiennoprzecinkowa o wartości 4 bajtów.

R8 12

Liczba zmiennoprzecinkowa o wartości 8 bajtów.

SafeArray 29

Element SafeArray, który jest tablicą samoopisującą, która niesie ze sobą typ, rangę i granice skojarzonych danych tablicy. Możesz użyć tego elementu członkowskiego z polem SafeArraySubType , aby zastąpić domyślny typ elementu.

Struct 27

WARIANT, który służy do marshalowania zarządzanych sformatowanych klas i typów wartości.

SysInt 31

Zależna od platformy, podpisana liczba całkowita: 4 bajty w 32-bitowym systemie Windows, 8 bajtów w 64-bitowym systemie Windows.

SysUInt 32

Zależna od platformy, niepodpisane liczba całkowita: 4 bajty w 32-bitowym systemie Windows, 8 bajtów w 64-bitowym systemie Windows.

TBStr 36

Ciąg Unicode char z prefiksem o długości. Rzadko używasz tego elementu członkowskiego przypominającego BSTR.

U1 4

Liczba całkowita bez znaku 1 bajtów.

U2 6

Liczba całkowita bez znaku 2 bajtów.

U4 8

Liczba całkowita bez znaku 4 bajtów.

U8 10

Liczba całkowita bez znaku 8 bajtów.

VariantBool 37

2-bajtowy, zdefiniowany przez ole typ VARIANT_BOOL (true = -1, false = 0).

VBByRefStr 34

Wartość umożliwiająca programowi Visual Basic zmianę ciągu w kodzie niezarządzanym i odzwierciedlanie wyników w kodzie zarządzanym. Ta wartość jest obsługiwana tylko w przypadku wywołania platformy.

Przykłady

Poniższy fragment kodu przedstawia sposób deklarowania niezarządzanego interfejsu implementowanego przez składnik COM w zarządzanym kodzie źródłowym. Atrybut System.Runtime.InteropServices.ComImportAttribute uniemożliwia eksportowanie interfejsu IMyStorage z powrotem do użytku przez com. (Klienci COM powinni bezpośrednio używać istniejącego składnika COM). W tym przykładzie MarshalAsAttribute określa kilka UnmanagedType elementów członkowskich, które reprezentują typy używane przez oryginalny interfejs 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

Uwagi

Użyj wyliczenia UnmanagedType z atrybutem System.Runtime.InteropServices.MarshalAsAttribute , aby określić sposób, w jaki typy są marshalowane podczas współdziałania z kodem niezarządzanym. Tego wyliczenia można użyć do marshalowania kodu przy użyciu prostych typów wartości (I1, I2, I4, I8, R4, R8, U2, U4 i U8), niezarządzanych typów, które są niedostępne w .NET Framework i różnych typów.

Aby uzyskać więcej informacji, zobacz Interoperating with Unmanaged Code (Współdziałanie z niezarządzanymi kodami).

Dotyczy

Zobacz też