Aplica-se 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

Sintomas

Quando liga o código que o Microsoft .NET Framework 4.5.1 ou o Microsoft .NET Framework 4.5.2 e o código de forma dinâmica a métodos (por exemplo, utilizando um script no Windows PowerShell, IronPython, IronRuby ou outro idioma dinâmico) chama o método de System.Runtime.InteropServices.Marshal.SizeOf ou System.Runtime.InteropServices.Marshal.PtrToStructure , poderá detectar os seguintes problemas.Nota Código que já for compilado num executável gerido não apresentar estas questões, a menos que esse código utiliza a palavra-chave dinâmica em c#.

Problema 1

Chamadas para System.Runtime.InteropServices.Marshal.SizeOf accionar a seguinte excepção MethodInvocationException :

Tipo de ' <nome do tipo>' não pode ser empacotada (marshall) como uma estrutura não gerida; pode ser calculado sem tamanho ou deslocamento significativo.

Problema 2

Chamadas para System.Runtime.InteropServices.Marshal.PtrToStructure accionar a seguinte excepção MethodInvocationException :

A estrutura especificada tem de ser ou ter informações de esquema.

Problema 3

Chamadas para System.Runtime.InteropServices.Marshal.PtrToStructure accionar a seguinte excepção RuntimeBinderException :

Não é possível converter implicitamente o tipo 'void' para 'objecto'.

Causa

Este problema ocorre porque os motores de script e linguagens dinâmicos podem ligar a uma sobrecarga nova que é introduzida no .NET Framework. Especificamente, as chamadas que anteriormente utilizado Marshal.SizeOf(Type) podem chamar Marshal.SizeOf < T > (T)e chamadas utilizado Marshal.PtrToStructure (IntPtr, tipo) podem chamar Marshal.PtrToStructure < T >(IntPtr, T). Esta alteração faz com que os métodos ou o Arquivador do tempo de execução para accionar uma excepção.

Solução alternativa

Para contornar este problema, altere o código para que possa utilizar a sobrecarga correcta, se o idioma permite-lhe efectuar este procedimento. Se não é possível especificar uma sobrecarga de método específico, altere o código para que possa utilizar a nova sobrecarga de método correctamente em vez disso.

Para c# dinâmica invocação

Adicione uma conversão System dentro a chamada de 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);

Nota Isto só é necessário quando um dos argumentos para o método é dinâmico.

Para scripts do Windows PowerShell

Adicione uma conversão System dentro a chamada de 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, utilize a nova sobrecarga de método. Por exemplo:

typeInstance = type()size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)

Estado

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".

Referências

Precisa de mais ajuda?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.