Sintomi
Quando il codice destinato al Microsoft.NET Framework 4.5.1 o di Microsoft.NET Framework 4.5.2 e il codice in modo dinamico viene associato a metodi (ad esempio, utilizzando uno script di Windows PowerShell, IronPython, IronRuby o un altro linguaggio dinamico) chiama il metodo System.Runtime.InteropServices.Marshal.SizeOf o System.Runtime.InteropServices.Marshal.PtrToStructure , possono verificarsi i seguenti problemi.
Nota: Il codice già compilato in un file eseguibile gestito non presenta questi problemi, a meno che non sia tale codice viene utilizzata la parola chiave dynamic in C#.Problema 1
Le chiamate a System.Runtime.InteropServices.Marshal.SizeOf l'eccezione seguente MethodInvocationException :
Tipo ' <nome>' non può essere eseguito il marshalling come struttura non gestita. Nessuna dimensione significativa o offset possono essere calcolate.
Problema 2
Le chiamate a System.Runtime.InteropServices.Marshal.PtrToStructure l'eccezione seguente MethodInvocationException :
La struttura specificata deve essere copiabile o disporre delle informazioni di layout.
Problema 3
Le chiamate a System.Runtime.InteropServices.Marshal.PtrToStructure l'eccezione seguente RuntimeBinderException :
Impossibile convertire implicitamente tipo 'void' in 'object'.
Causa
Questo problema si verifica perché i motori di script e linguaggi dinamici possono associare a un nuovo overload di che è stato introdotto nel.NET Framework. In particolare, chiama utilizzato precedentemente Marshal.SizeOf(Type) può ora chiama il metodo Marshal. sizeof < T > (T), e chiamate utilizzato Marshal. PtrToStructure (IntPtr, tipo) possono ora chiamare Marshal. PtrToStructure < T >(IntPtr, T). Questa modifica fa sì che i metodi o il gestore di associazione di runtime per generare un'eccezione.
Soluzione alternativa
Per risolvere questo problema, modificare il codice in modo che utilizzi l'overload corretto se la lingua consente di eseguire questa operazione. Se non è possibile specificare un overload del metodo specifico, modificare il codice in modo che utilizzi il nuovo overload del metodo correttamente invece.
Per C# chiamata dinamica
Aggiungere un cast Type all'interno della chiamata al metodo SizeOf o metodo PtrToStructure. Per esempio:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Nota: Questa operazione è necessaria solo quando uno degli argomenti al metodo dinamico.
Per gli script di Windows PowerShell
Aggiungere un cast Type all'interno della chiamata al metodo SizeOf o metodo PtrToStructure. Per esempio:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
Per gli script di IronPython
Creare una nuova istanza di tipo del tipo e quindi utilizzare il nuovo overload del metodo. Per esempio:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance) obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Stato
Microsoft ha confermato che questo è un problema dei prodotti Microsoft elencati nella sezione "Si applica a".