Applies ToWindows Vista Service Pack 2 Windows 7 Service Pack 1 Windows Server 2008 Service Pack 2 Windows Server 2008 R2 Service Pack 1 Windows 8 Windows Server 2012 Datacenter Windows Server 2012 Datacenter Windows Server 2012 Essentials Windows Server 2012 Foundation Windows Server 2012 Foundation Windows Server 2012 Standard Windows Server 2012 Standard Windows Server 2012 R2 Datacenter Windows Server 2012 R2 Essentials Windows Server 2012 R2 Foundation Windows Server 2012 R2 Standard Windows 8.1

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.