codice non sicuro e le dichiarazioni fissi con StringBuilder
-
13-09-2019 - |
Domanda
Mi chiedevo su come passare una stringa o uno StringBuilder ad una funzione C che uscita un parametro stringa. Ho trovato una grande risposta in
Chiamata funzione non gestita da C #: dovrei passare StringBuilder o utilizzare codice non sicuro
?Ma ho un dubbio. Chiunque può spiegare a me perché il garbage collector non consente di spostare il (gestito) istanza StringBuilder durante l'esecuzione della funzione importata?
Soluzione
predefinito Marshalling per archi per i dettagli su come corda e StringBuilder è marshalling quando si utilizza COM e P / Invoke. Non dice esplicitamente perché il tipo di utilizzo è sicuro, ma non indica che l'uso di corde e StringBuilder per P / Invoke è supportato e destinato comportamento. Ho il sospetto che il sistema di smistamento prende cura di pinning il buffer per la durata della chiamata esterna, impedendo il GC da spostarla.