Entrar com a conta da Microsoft
Entrar ou criar uma conta.
Olá,
Selecionar uma conta diferente.
Você tem várias contas
Escolha a conta com a qual você deseja entrar.

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".

Referências

Precisa de mais ajuda?

Quer mais opções

Explore os benefícios da assinatura, procure cursos de treinamento, saiba como proteger seu dispositivo e muito mais.

As comunidades ajudam você a fazer e responder perguntas, fazer comentários e ouvir especialistas com conhecimento avançado.

Essas informações foram úteis?

Qual é o seu grau de satisfação com a qualidade do idioma?
O que afetou sua experiência?
Ao pressionar enviar, seus comentários serão usados para aprimorar os produtos e serviços da Microsoft. Seu administrador de TI poderá coletar esses dados. Política de Privacidade.

Agradecemos seus comentários!

×