J'ai deux composants communicants - l'un géré, l'autre non géré. Le gestionnaire doit extraire une chaîne de caractères de l'implémentation non gérée (la même chaîne ou juste une copie). J'ai essayé le code suivant.Passage d'une chaîne de caractères const char * de non géré à géré
// Unmanaged code
const char* GetTestName(Test* test)
{
return test->getName();
}
// Managed wrapper
[DllImport(DllName, EntryPoint = "GetTestName")]
public static extern IntPtr GetTestName(IntPtr testObj);
// API Invocation
IntPtr testName = GetTestName(test);
string testStr = Marshal.PtrToStringAuto(testName);
Mais, la valeur de testStr n'est pas ce qui est attendu. Est-ce que quelqu'un sait ce que je fais mal ici? Toute suggestion serait vraiment utile.
J'ai essayé ça. N'a pas fonctionné. J'ai effectivement essayé toutes les méthodes PtrToStringX() disponibles. Est-ce que je fais quelque chose de mal à rassembler les données? L'unité non gérée est responsable de la mémoire de chaîne de caractères. – Elroy
Non, votre déclaration pinvoke est correcte. Je m'assurerais de m'assurer que l'argument * test * est correct. Déboguez ceci, activez le débogage non géré et définissez un point d'arrêt sur test-> getName(). –
Yup, j'ai compris. getName() est buggé. Merci Hans. – Elroy