Excepciones en Windows PowerShell, otros lenguajes dinámicos y código C# ejecutado dinámicamente cuando el código destinado a .NET Framework llama a algunos métodos

Se aplica a
Windows 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 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".

Referencias