Udostępnij za pośrednictwem


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 prefiksem pojedynczego bajtu. 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 marshaluje obiekt jako ten typ. Ten element członkowski jest prawidłowy tylko w przypadku metod wywoływania platformy.

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. 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. Można go UnmanagedType użyć tylko w tablicy, której elementy są wyświetlane jako pola w strukturze.

ByValTStr 23

Używane w przypadku tablic znaków o stałej długości, które są wyświetlane w strukturze. ByValTStr typy zachowują się jak ciągi typu C, ciągi o stałym rozmiarze wewnątrz struktury (na przykład char s[5]). Typ znaku używany z 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. Decimal Służy do marshalingu wartości dziesiętnej jako typu waluty COM zamiast jako Decimal.

CustomMarshaler 44

Określa niestandardową klasę marshalera w przypadku użycia z polem MarshalType lub MarshalTypeRef . Pole MarshalCookie może służyć do przekazywania dodatkowych informacji do niestandardowego marshalera. Ten element członkowski można użyć 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

Typ natywny skojarzony z elementem I4 lub i U4 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. Tego elementu członkowskiego można użyć w typie Delegate danych lub typie dziedziczynym z elementu Delegate.

HString 47

Ciąg środowiska uruchomieniowego 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 z podpisem 1 bajtu. Za pomocą tego elementu członkowskiego można przekształcić wartość logiczną w 1 bajt, styl bool C (true = 1, false = 0).

I2 5

Liczba całkowita z podpisem 2 bajtów.

I4 7

Liczba całkowita z podpisem 4 bajtów.

I8 9

Liczba całkowita z podpisem 8 bajtów.

IDispatch 26

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

IInspectable 46

Wskaźnik interfejsu środowiska uruchomieniowego 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ść tablicy zarządzanej. 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 zaimplementowanego 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 programie .NET Framework i różnych typach.

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

Dotyczy

Zobacz też