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