UnmanagedMarshal Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Precaución
An alternate API is available: Emit the MarshalAs custom attribute instead. http://go.microsoft.com/fwlink/?linkid=14202
Representa a la clase que describe cómo calcular las referencias de un campo de código administrado a código no administrado. Esta clase no puede heredarse.
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
- Herencia
-
UnmanagedMarshal
- Atributos
Ejemplos
En el ejemplo de código siguiente se muestra el código de reemplazo para el tipo obsoleto UnmanagedMarshal . En el ejemplo se emite un ensamblado de un solo módulo denominado EmitMarshalAs.dll
, que contiene un tipo denominado Sample
. El tipo tiene un método denominado Test
, con un parámetro de tipo String. El ejemplo de código aplica con MarshalAsAttributeUnmanagedType.BStr al parámetro .
Puede usar el Ildasm.exe (Desensamblador de IL) para examinar el ensamblado emitido y observar que el parámetro está marcado como 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
Comentarios
En el ejemplo de código se muestra la solución alternativa para este tipo obsoleto.
La serialización es el proceso de empaquetado y desempaquetado de parámetros para que se puedan producir llamadas a procedimientos remotos. Durante la serialización, un campo puede someterse a una conversión de formato cuando el formato del tipo administrado es diferente del formato del tipo no administrado correspondiente. Por ejemplo, puede que desee serializar un String
tipo como un BSTR no administrado. El tiempo de ejecución controla automáticamente algunas conversiones de formato. Para invalidar el comportamiento predeterminado, debe usar la UnmanagedMarshal
clase para definir la conversión de formato.
Propiedades
BaseType |
Obsoletos.
Obtiene un tipo base no administrado. Esta propiedad es de sólo lectura. |
ElementCount |
Obsoletos.
Obtiene un elemento numérico. Esta propiedad es de sólo lectura. |
GetUnmanagedType |
Obsoletos.
Indica un tipo no administrado. Esta propiedad es de sólo lectura. |
IIDGuid |
Obsoletos.
Obtiene un GUID. Esta propiedad es de sólo lectura. |
Métodos
DefineByValArray(Int32) |
Obsoletos.
Especifica una matriz de longitud fija (ByValArray) para calcular las referencias al código no administrado. |
DefineByValTStr(Int32) |
Obsoletos.
Especifica una cadena de un búfer de matriz fija (ByValTStr) para calcular las referencias al código no administrado. |
DefineLPArray(UnmanagedType) |
Obsoletos.
Especifica una matriz |
DefineSafeArray(UnmanagedType) |
Obsoletos.
Especifica una matriz |
DefineUnmanagedMarshal(UnmanagedType) |
Obsoletos.
Especifica un tipo determinado para el que se van a calcular las referencias al código no administrado. |
Equals(Object) |
Obsoletos.
Determina si el objeto especificado es igual que el objeto actual. (Heredado de Object) |
GetHashCode() |
Obsoletos.
Sirve como la función hash predeterminada. (Heredado de Object) |
GetType() |
Obsoletos.
Obtiene el Type de la instancia actual. (Heredado de Object) |
MemberwiseClone() |
Obsoletos.
Crea una copia superficial del Object actual. (Heredado de Object) |
ToString() |
Obsoletos.
Devuelve una cadena que representa el objeto actual. (Heredado de Object) |