Iniciar sessão com a Microsoft
Iniciar sessão ou criar uma conta.
Olá,
Selecione uma conta diferente.
Tem várias contas
Selecione a conta com a qual pretende iniciar sessão.

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.

As comunidades ajudam-no a colocar e a responder perguntas, a dar feedback e a ouvir especialistas com conhecimentos abrangentes.

Estas informações foram úteis?

Quão satisfeito está com a qualidade do idioma?
O que afetou a sua experiência?
Ao selecionar submeter, o seu feedback será utilizado para melhorar os produtos e serviços da Microsoft. O seu administrador de TI poderá recolher estes dados. Declaração de Privacidade.

Obrigado pelo seu feedback!

×