Accedi con Microsoft
Accedi o crea un account.
Salve,
Seleziona un altro account.
Hai più account
Scegli l'account con cui vuoi accedere.

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

Riferimenti

Serve aiuto?

Vuoi altre opzioni?

Esplorare i vantaggi dell'abbonamento e i corsi di formazione, scoprire come proteggere il dispositivo e molto altro ancora.

Le community aiutano a porre e a rispondere alle domande, a fornire feedback e ad ascoltare gli esperti con approfondite conoscenze.

Queste informazioni sono risultate utili?

Come valuti la qualità della lingua?
Cosa ha influito sulla tua esperienza?
Premendo Inviare, il tuo feedback verrà usato per migliorare i prodotti e i servizi Microsoft. L'amministratore IT potrà raccogliere questi dati. Informativa sulla privacy.

Grazie per il feedback!

×