J'utilise une DLL avec la fonction suivante dans C# Visual Studio 2008:Comment transmettre un paramètre par référence au code managé en C#?
[DllImport("slpapi62", EntryPoint = "[email protected]")]
public static extern int SlpGetPrinterName(int nIndex, string strPrinterName, int nMaxChars);
L'appel de cette fonction, strPrinterName
est supposé retourner une chaîne.
string name = "";
SlpGetPrinterName(0, name, 128);
Comment puis-je faire passer ce paramètre par référence?
Cela a fonctionné! Quelqu'un peut-il me dire pourquoi j'ai besoin d'utiliser la classe StringBuilder par rapport à une chaîne normale? –
En fait, une chaîne est un type de référence, mais elle est immuable. Par conséquent, lorsque le marshaleur appelle un code non géré avec une chaîne, il crée une copie de son tampon afin que l'original reste inchangé. Techncially, il devrait le faire de toute façon parce que 1) la chaîne n'est pas épinglée (le GC peut déplacer ses données) et 2) il doit le convertir en ANSI ou tout ce qui est demandé. Fondamentalement, cela signifie que même si la méthode que vous appelez modifie le tampon, les modifications sont simplement rejetées. Le tampon de StringBuilder est mutable, ce qui signifie que si la fonction modifie son tampon, elle est recopiée dans le tampon de StringBuilder. –
Son cas de type Value vs Reference. Bien que la chaîne soit techniquement un type de référence, elle se comporte comme un type de valeur: http://stackoverflow.com/questions/636932/in-c-why-is-string-a-reference-type-that-behaves-like-a- valeur-type – 7wp