Iniciar sesión con Microsoft
Iniciar sesión o crear una cuenta
Hola:
Seleccione una cuenta diferente.
Tiene varias cuentas
Elija la cuenta con la que desea iniciar sesión.

Síntomas

Cuando se enlaza el código destinado a la de Microsoft.NET Framework 4.5.1 o de.NET Framework de Microsoft 4.5.2 y el código dinámicamente a métodos (por ejemplo, mediante una secuencia de comandos de Windows PowerShell, IronPython, IronRuby u otro lenguaje dinámico) llama al método System.Runtime.InteropServices.Marshal.SizeOf o el método System.Runtime.InteropServices.Marshal.PtrToStructure , puede experimentar los problemas siguientes.

Nota: Código que ya se compila en un archivo ejecutable administrado no presentan estos problemas, a menos que el código utiliza la palabra clave dynamic en C#.

Problema 1

Llamadas a System.Runtime.InteropServices.Marshal.SizeOf inician una excepción MethodInvocationException :

Tipo ' <nombre de tipo>' no puede ser ordenado como una estructura no administrada; no se puede calcular ningún desplazamiento o tamaño significativos.

Problema 2

Las llamadas a System.Runtime.InteropServices.Marshal.PtrToStructure inician una excepción MethodInvocationException :

La estructura especificada debe ser bits/bytes o tener información de diseño.


Problema 3

Las llamadas a System.Runtime.InteropServices.Marshal.PtrToStructure producen la siguiente excepción RuntimeBinderException :

No se puede convertir implícitamente el tipo 'void' a 'object'.


Causa

Este problema se produce porque los motores de secuencias de comandos y lenguajes dinámicos pueden enlazar con una nueva sobrecarga que se introdujeron en el.NET Framework. En concreto, las llamadas que anteriormente utilizaban Marshal.SizeOf(Type) ahora pueden llamar a Marshal.SizeOf < T > (T)y llamadas que utiliza el método Marshal.PtrToStructure (IntPtr, tipo) ahora pueden llamar a Marshal.PtrToStructure < T >(IntPtr, T). Este cambio hace que los métodos o el enlazador en tiempo de ejecución se iniciará una excepción.

Solución alternativa

Para evitar este problema, cambie el código para que utilice la sobrecarga del correcta si su idioma le permite hacer esto. Si no se especifica una sobrecarga del método específico, cambie el código para que utilice la sobrecarga del método nuevo correctamente en su lugar.

Para la invocación dinámica del C#

Agregar una conversión a System.Type dentro de la llamada al método SizeOf o PtrToStructure. Por ejemplo:

object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);


Nota: Esto sólo es necesario cuando uno de los argumentos para el método es dinámico.

Las secuencias de comandos de Windows PowerShell

Agregar una conversión a System.Type dentro de la llamada al método SizeOf o PtrToStructure. Por ejemplo:

$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)

Las secuencias de comandos de IronPython

Crear una nueva instancia de tipo del tipo y, a continuación, utilice la sobrecarga del método nuevo. Por ejemplo:

typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)

obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".

Referencias

¿Necesita más ayuda?

¿Quiere más opciones?

Explore las ventajas de las suscripciones, examine los cursos de aprendizaje, aprenda a proteger su dispositivo y mucho más.

Las comunidades le ayudan a formular y responder preguntas, enviar comentarios y leer a expertos con conocimientos extensos.

¿Le ha sido útil esta información?

¿Cuál es tu grado de satisfacción con la calidad del lenguaje?
¿Qué ha afectado a su experiencia?
Si presiona Enviar, sus comentarios se usarán para mejorar los productos y servicios de Microsoft. El administrador de TI podrá recopilar estos datos. Declaración de privacidad.

¡Gracias por sus comentarios!

×