Sintomas
Quando o código que visa o.NET Framework do Microsoft 4.5.1 ou o.NET Framework do Microsoft 4.5.2 e o código dinamicamente vincula a métodos (por exemplo, usando um script no Windows PowerShell, IronPython, IronRuby ou outra linguagem dinâmica) chama o método System.Runtime.InteropServices.Marshal.SizeOf ou o System.Runtime.InteropServices.Marshal.PtrToStructure , você pode enfrentar os seguintes problemas.
Observação: Código que já é compilado em um executável gerenciado não apresentem esses problemas, a menos que o código usa a palavra-chave dynamic em C#.
Problema 1
Chamadas para System.Runtime.InteropServices.Marshal.SizeOf lançam a seguinte exceção de MethodInvocationException :
Tipo ' <nome do tipo>' não pode ser empacotado como uma estrutura não gerenciada. nenhum deslocamento ou tamanho significativo pode ser calculado.
Problema 2
Chamadas para System.Runtime.InteropServices.Marshal.PtrToStructure lançam a seguinte exceção de MethodInvocationException :
A estrutura especificada deve ser blittable ou possuir informações de layout.
Problema 3
Chamadas para System.Runtime.InteropServices.Marshal.PtrToStructure lançam a seguinte exceção de RuntimeBinderException :
Não é possível converter implicitamente o tipo 'void' em 'objeto'.
Causa
Esse problema ocorre porque os mecanismos de script e linguagens dinâmicas podem vincular a uma nova sobrecarga introduzida no.NET Framework. Especificamente, chamadas que anteriormente usadas Marshal.SizeOf(Type) agora podem chamar Marshal. sizeof < T > (T)e chamadas que usadas PtrToStructure (IntPtr, tipo) agora podem chamar PtrToStructure < T >(IntPtr, T). Essa alteração faz com que os métodos ou o fichário em tempo de execução para acionar uma exceção.
Solução alternativa
Para contornar esse problema, altere o código para que ele use a sobrecarga correta se seu idioma permite que você faça isso. Se você não pode especificar uma sobrecarga de método específico, altere o código para que ele usa a nova sobrecarga do método corretamente em vez disso.
Para C# invocação dinâmica
Adicione um efeito de System. Type dentro da chamada ao método SizeOf ou PtrToStructure. Por exemplo:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Observação: Isso só é necessário quando um dos argumentos para o método é dinâmico.
Para scripts do Windows PowerShell
Adicione um efeito de System. Type dentro da chamada ao método SizeOf ou PtrToStructure. Por exemplo:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
Para scripts de IronPython
Criar uma nova instância de tipo do tipo e, em seguida, usar a nova sobrecarga do método. Por exemplo:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)
obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Status
A Microsoft confirma que este é um problema em seus produtos listados na seção "Aplica-se a".