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".