Case di studio dell'attributo Marshalas
-
28-10-2019 - |
Domanda
Quando dovremmo usare questo attributo e perché ne abbiamo bisogno? Ad esempio, se la funzione nativa in C prende come parametro un puntatore per il carbone senza segno, e so che è necessario soddisfare l'array di carattere senza segno, perché non posso usare una matrice di byte in c# per usare questa funzione? È necessario fare marshalling?
Soluzione
Il runtime sarà in grado di determinare automaticamente come marshalla i dati tra il codice nativo e gestito nella maggior parte dei casi, quindi generalmente non è necessario specificare l'attributo. MarshalAs
è necessario solo quando c'è un'ambiguità nella definizione (e si desidera dire il runtime precisamente come marshall dei dati) o se si richiede un comportamento non default.
Nella mia esperienza, MarshalAs
è davvero richiesto solo quando si lavora con le stringhe, poiché ci sono così tante rappresentazioni diverse nel codice nativo; Unicode/ANSI, C-Strings o no, ecc.
Altri suggerimenti
Ulteriore uso dell'attributo dei marescialati è il marshalling di array di dimensioni fisse (comprese le stringhe di dimensioni fisse) con parametri di Byvalarray e SizeConst. Ad esempio, molte strutture dell'API di Windows contengono stringhe di dimensioni fisse.