J'ai une méthode que je veux importer à partir d'une DLL et qu'il a une signature de: J'ai essayé p> et p> mais que l'on n'a rien retourné dans la variable DrivelleTter. P> P>
4 Réponses :
Il apparaît la fonction Je pense que le moyen le plus simple d'aborder ce problème est de passer un getdrivetter code> s'attend à un
char * code> qui pointe une mémoire suffisante pour contenir la lettre de lecteur.
cru code> et d'envelopper les appels sur
getdrivetter code> dans une API qui prend soin de la gestion des ressources et de la conversion à une chaîne
code>. p>
@Malfist, la valeur i1 indique au CLR de repasser la valeur sous forme d'un entier 1 octet. Il était en fait incorrect dans cet échantillon comme I4 est la valeur correcte (mise à jour un peu mal). Pourquoi consulter cette entrée de blog, j'ai écrit sur Marshalling Bool Values: blogs.msdn.com/jaredpar/archive/2008/10/14/...
Quand je le fais i4, je reçois la maréchaldirectiveException
@Malfist, désolé, il devrait être non gérédype.bool code>. Été l'un de ces jours.
Le StringBuilder est probablement la voie à suivre, mais vous devez définir la capacité du constructeur de chaînes avant d'appeler la fonction. Étant donné que c # n'a aucune idée de la quantité de mémoire que getdriveter code> utilisera, vous devez vous assurer que le StringBuilder dispose de suffisamment d'espace. Le marshaller passera ensuite un
char * code> attribué à cette longueur à la fonction et marhsall le retourner sur le StringBuilder.
[return:MarshalAsAttribute(UnmanagedType.I4)]
private static extern bool GetDriveLetter(StringBuilder DriveLetter);
public static bool GetDriveLetter(out string driverLetter) {
StringBuilder buffer = new StringBuilder(10);
bool ret = GetDriveLetter(buffer);
driveLetter = buffer.ToString();
return ret;
}
Ne renvoie pas la chaîne correcte, contrairement à la réponse acceptée.
Et si vous ajoutez Chaset = Charset.ansi à l'attribut Dllimport? C'est si vous vous souciez que vous avez une solution de travail.
Ajout de Chalet.ansi au Dllimport ne fait aucune différence.
[DllImport("mydll.dll")] public static extern bool GetDriveLetter([MarshalAs(UnmanagedType.LPStr)] string DriveLetter)
J'ai eu une situation connexe dans laquelle la fonction avait un paramètre char * code> et j'avais manqué le
Charset code> Affectation:
[DllImport("library.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr MyFunc(string myString);