UnmanagedMarshal Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Upozornění
An alternate API is available: Emit the MarshalAs custom attribute instead. http://go.microsoft.com/fwlink/?linkid=14202
Představuje třídu, která popisuje, jak zařašovat pole ze spravovaného na nespravovaný kód. Tato třída se nemůže dědit.
public ref class UnmanagedMarshal sealed
[System.Serializable]
public sealed class UnmanagedMarshal
[System.Serializable]
[System.Obsolete("An alternate API is available: Emit the MarshalAs custom attribute instead. http://go.microsoft.com/fwlink/?linkid=14202")]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class UnmanagedMarshal
[<System.Serializable>]
type UnmanagedMarshal = class
[<System.Serializable>]
[<System.Obsolete("An alternate API is available: Emit the MarshalAs custom attribute instead. http://go.microsoft.com/fwlink/?linkid=14202")>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type UnmanagedMarshal = class
Public NotInheritable Class UnmanagedMarshal
- Dědičnost
-
UnmanagedMarshal
- Atributy
Příklady
Následující příklad kódu ukazuje náhradní kód pro zastaralý UnmanagedMarshal typ. Příklad vygeneruje sestavení s jedním modulem s názvem EmitMarshalAs.dll
, které obsahuje typ s názvem Sample
. Typ má metodu s názvem Test
, s jedním parametrem typu String. Příklad kódu použije parametr MarshalAsAttribute s UnmanagedType.BStr na parametr .
Pomocí Ildasm.exe (IL Disassembler) můžete prozkoumat vygenerované sestavení a zjistit, že parametr je označen .marshal(bstr)
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::InteropServices;
void main()
{
AppDomain^ myDomain = AppDomain::CurrentDomain;
AssemblyName^ myAsmName = gcnew AssemblyName("EmitMarshalAs");
AssemblyBuilder^ myAssembly =
myDomain->DefineDynamicAssembly(myAsmName,
AssemblyBuilderAccess::RunAndSave);
ModuleBuilder^ myModule =
myAssembly->DefineDynamicModule(myAsmName->Name,
myAsmName->Name + ".dll");
TypeBuilder^ myType =
myModule->DefineType("Sample", TypeAttributes::Public);
MethodBuilder^ myMethod =
myType->DefineMethod("Test", MethodAttributes::Public,
nullptr, gcnew array<Type^> { String::typeid });
// Get a parameter builder for the parameter that needs the
// attribute, using the HasFieldMarshal attribute. In this
// example, the parameter is at position 0 and has the name
// "arg".
ParameterBuilder^ pb =
myMethod->DefineParameter(0,
ParameterAttributes::HasFieldMarshal, "arg");
// Get the MarshalAsAttribute constructor that takes an
// argument of type UnmanagedType.
//
//Type^ maattrType = MarshalAsAttribute::typeid;
ConstructorInfo^ ci =
(MarshalAsAttribute::typeid)->GetConstructor(
gcnew array<Type^> { UnmanagedType::typeid });
// Create a CustomAttributeBuilder representing the attribute,
// specifying the necessary unmanaged type. In this case,
// UnmanagedType.BStr is specified.
//
CustomAttributeBuilder^ cabuilder =
gcnew CustomAttributeBuilder(
ci, gcnew array<Object^> { UnmanagedType::BStr });
// Apply the attribute to the parameter.
//
pb->SetCustomAttribute(cabuilder);
ILGenerator^ il = myMethod->GetILGenerator();
il->Emit(OpCodes::Ret);
Type^ finished = myType->CreateType();
myAssembly->Save(myAsmName->Name + ".dll");
}
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
public class Example
{
public static void Main()
{
AppDomain myDomain = AppDomain.CurrentDomain;
AssemblyName myAsmName = new AssemblyName("EmitMarshalAs");
AssemblyBuilder myAssembly =
myDomain.DefineDynamicAssembly(myAsmName,
AssemblyBuilderAccess.RunAndSave);
ModuleBuilder myModule =
myAssembly.DefineDynamicModule(myAsmName.Name,
myAsmName.Name + ".dll");
TypeBuilder myType =
myModule.DefineType("Sample", TypeAttributes.Public);
MethodBuilder myMethod =
myType.DefineMethod("Test", MethodAttributes.Public,
null, new Type[] { typeof(string) });
// Get a parameter builder for the parameter that needs the
// attribute, using the HasFieldMarshal attribute. In this
// example, the parameter is at position 0 and has the name
// "arg".
ParameterBuilder pb =
myMethod.DefineParameter(0,
ParameterAttributes.HasFieldMarshal, "arg");
// Get the MarshalAsAttribute constructor that takes an
// argument of type UnmanagedType.
//
ConstructorInfo ci =
typeof(MarshalAsAttribute).GetConstructor(
new Type[] { typeof(UnmanagedType) });
// Create a CustomAttributeBuilder representing the attribute,
// specifying the necessary unmanaged type. In this case,
// UnmanagedType.BStr is specified.
//
CustomAttributeBuilder cabuilder =
new CustomAttributeBuilder(
ci, new object[] { UnmanagedType.BStr });
// Apply the attribute to the parameter.
//
pb.SetCustomAttribute(cabuilder);
// Emit a dummy method body.
ILGenerator il = myMethod.GetILGenerator();
il.Emit(OpCodes.Ret);
Type finished = myType.CreateType();
myAssembly.Save(myAsmName.Name + ".dll");
}
}
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices
Public Class Example
Public Shared Sub Main()
Dim myDomain As AppDomain = AppDomain.CurrentDomain
Dim myAsmName As New AssemblyName("EmitMarshalAs")
Dim myAssembly As AssemblyBuilder = _
myDomain.DefineDynamicAssembly(myAsmName, _
AssemblyBuilderAccess.RunAndSave)
Dim myModule As ModuleBuilder = _
myAssembly.DefineDynamicModule(myAsmName.Name, _
myAsmName.Name & ".dll")
Dim myType As TypeBuilder = _
myModule.DefineType("Sample", TypeAttributes.Public)
Dim myMethod As MethodBuilder = _
myType.DefineMethod("Test", MethodAttributes.Public, _
Nothing, new Type() { GetType(String) })
' Get a parameter builder for the parameter that needs the
' attribute, using the HasFieldMarshal attribute. In this
' example, the parameter is at position 0 and has the name
' "arg".
Dim pb As ParameterBuilder = _
myMethod.DefineParameter(0, _
ParameterAttributes.HasFieldMarshal, "arg")
' Get the MarshalAsAttribute constructor that takes an
' argument of type UnmanagedType.
'
Dim ciParameters() As Type = { GetType(UnmanagedType) }
Dim ci As ConstructorInfo = _
GetType(MarshalAsAttribute).GetConstructor(ciParameters)
' Create a CustomAttributeBuilder representing the attribute,
' specifying the necessary unmanaged type. In this case,
' UnmanagedType.BStr is specified.
'
Dim ciArguments() As Object = { UnmanagedType.BStr }
Dim cabuilder As New CustomAttributeBuilder(ci, ciArguments)
' Apply the attribute to the parameter.
'
pb.SetCustomAttribute(cabuilder)
' Emit a dummy method body.
Dim il As ILGenerator = myMethod.GetILGenerator()
il.Emit(OpCodes.Ret)
myType.CreateType()
myAssembly.Save(myAsmName.Name & ".dll")
End Sub
End Class
Poznámky
Příklad kódu ukazuje alternativní řešení pro tento zastaralý typ.
Zařazování je proces balení a rozbalování parametrů, aby mohlo dojít ke vzdáleným voláním procedur. Během zařazování může pole projít převodem formátu, pokud se formát spravovaného typu liší od formátu odpovídajícího nespravovaného typu. Můžete například chtít uspořádat String
typ jako nespravovaný BSTR. Modul runtime zpracovává některé převody formátu automaticky. Chcete-li přepsat výchozí chování, musíte k definování převodu UnmanagedMarshal
formátu použít třídu.
Vlastnosti
BaseType |
Zastaralé.
Získá nespravovaný základní typ. Tato vlastnost je jen ke čtení. |
ElementCount |
Zastaralé.
Získá prvek číslo. Tato vlastnost je jen ke čtení. |
GetUnmanagedType |
Zastaralé.
Označuje nespravovaný typ. Tato vlastnost je jen ke čtení. |
IIDGuid |
Zastaralé.
Získá identifikátor GUID. Tato vlastnost je jen ke čtení. |
Metody
DefineByValArray(Int32) |
Zastaralé.
Určuje pole s pevnou délkou (ByValArray) pro zařazování do nespravovaného kódu. |
DefineByValTStr(Int32) |
Zastaralé.
Určuje řetězec v vyrovnávací paměti s pevným polem (ByValTStr) pro zařazování do nespravovaného kódu. |
DefineLPArray(UnmanagedType) |
Zastaralé.
Určuje |
DefineSafeArray(UnmanagedType) |
Zastaralé.
Určuje |
DefineUnmanagedMarshal(UnmanagedType) |
Zastaralé.
Určuje daný typ, který má být zařazován do nespravovaného kódu. |
Equals(Object) |
Zastaralé.
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetHashCode() |
Zastaralé.
Slouží jako výchozí hashovací funkce. (Zděděno od Object) |
GetType() |
Zastaralé.
Získá aktuální Type instanci. (Zděděno od Object) |
MemberwiseClone() |
Zastaralé.
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
ToString() |
Zastaralé.
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |