Síntomas
Cuando el código destinado a Microsoft .NET Framework 4.5.1 o Microsoft .NET Framework 4.5.2, y el código se enlaza dinámicamente a métodos (por ejemplo, mediante un script en Windows PowerShell, IronPython, IronRuby u otro lenguaje dinámico) llama al método System.Runtime.InteropServices.Marshal.SizeOf o al método System.Runtime.InteropServices.Marshal.PtrToStructure, puede experimentar los siguientes problemas.
Nota El código que ya está compilado en un ejecutable administrado no presenta estos problemas, a menos que use la palabra clave dynamic en C#.
Problema 1
Las llamadas a System.Runtime.InteropServices.Marshal.SizeOf producen la siguiente excepción MethodInvocationException:
Nota
El tipo "Nombre> de< tipo" no se puede calcular como una estructura no administrada; no se puede calcular ningún tamaño o desplazamiento significativos.
Problema 2
Las llamadas a System.Runtime.InteropServices.Marshal.PtrToStructure producen la siguiente excepción MethodInvocationException:
Nota
La estructura especificada debe ser blitable o tener información de diseño.
Problema 3
Las llamadas a System.Runtime.InteropServices.Marshal.PtrToStructure producen la siguiente excepción RuntimeBinderException:
Nota
No se puede convertir implícitamente el tipo "void" en "object".
Causa
Este problema se produce porque los motores de scripting y los lenguajes dinámicos pueden enlazar a una nueva sobrecarga introducida en .NET Framework. Específicamente, las llamadas que anteriormente usaban Marshal.SizeOf(Type) ahora pueden llamar a Marshal.SizeOf<T>(T), y las llamadas que usaban Marshal.PtrToStructure(IntPtr, Type) ahora pueden llamar a Marshal.PtrToStructure<T>(IntPtr, T). Este cambio hace que los métodos o el enlazador de tiempo de ejecución produzcan una excepción.
Solución alternativa
Para solucionar este problema, cambie el código de manera que utilice la sobrecarga correcta si el lenguaje se lo permite. Si no puede especificar una sobrecarga de método específica, cambie el código para que utilice la nueva sobrecarga de método correctamente en su lugar.
Para la invocación dinámica de C#
Agregue un cast a System.Type dentro de la llamada al método SizeOf o al método 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 solo es necesario cuando uno de los argumentos del método es dinámico.
Para scripts de Windows PowerShell
Agregue un cast a System.Type dentro de la llamada al método SizeOf o al método PtrToStructure. Por ejemplo:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
Para scripts de IronPython
Cree una nueva instancia de tipo del tipo y, a continuación, utilice la nueva sobrecarga de método. 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".