L'appel de dll c++ fonctions retournant char* en c#. Ne peut pas utiliser DllImport()
J'ai une dll c++ avec 2 fonctions
const char* getVersionText1(void);
void getVersionText2(const char** res);
À la fois une fonction retourne une chaîne de caractères décrivant la version du produit. La première fonction retourne comme const char* (ce qui signifie qu'il alloue et traiter localise en interne) et la seconde, on obtient un pointeur de type char* et juste à point pour un char* décrivant la version.
Je tiens à appeler ces fonctions à partir de C# et de l'affichage du texte.
Je ne peux pas utiliser [dllimport ...] de style depuis la commande de l'appel des fonctions est important. J'ai d'abord appeler le constructeur de getVersion et enfin le destructeur. Dll doit être chargée en mémoire.
Pouvez-vous s'il vous plaît poster les quelques lignes de codes que l'impression du texte pour les deux fonctions.
Je suis novice en C#, donc désolé si vous trouvez mon code problématique
J'ai essayé
static class NativeMethods{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
}
class Program{
//Define function pointers to entires in DLL
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate IntPtr getVersionText1();
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void getVersionText2(IntPtr );
static void Main(string[] args){
//Pointers to functions of DLL.
getVersionText1 f1;
getVersionText2 f2;
IntPtr pDll = NativeMethods.LoadLibrary("p:\\my.dll");
IntPtr pAddressOfFunctionToCall;
pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "getVersionText1 ");
f1 = (getVersionText1)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(getVersionText1));
pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "getVersionText2 ");
f2 = (getVersionText2)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(getVersionText2));
//Here I don't know what to do. It doesn't work ????
IntPtr verText = f1();
String s = Marshal.PtrToStringAuto(verText);
Console.WriteLine(s); //Doesnt work
//And how to use the second function. How do I sent a pointer to char* ???
}
}
getVersionText1
et getVersionText2
sont les vrais noms des fonctions exportées? C++ name mangling habituellement des changements de votre exporté noms. Vous pouvez vérifier la exporté noms avec n'importe quelle DLL export viewer.J'en suis sûr. J'ai écrit la DLL en C++
Vous pourriez faire un manged C++/CLI wrapper DLL pour servir en tant que communicateur entre le C++ et le code C#
OriginalL'auteur DanielHsH | 2013-02-19
Vous devez vous connecter pour publier un commentaire.
Voici une façon de faire de vos appels. Il y a peut être plus courte alternatives que d'effectuer la utf8/conversions de chaînes automatiquement.
Vous pouvez activer l'utilisation de code unsafe à partir de l'explorateur de solutions -> Propriétés -> Build -> Autoriser le code unsafe
Je ne peux pas utiliser dangereuse depuis ma DLL est intégré dans l'application tierce et je ne peux pas forcer le client à l'utilisation dangereuse de la compilation. Mais la solution est le mot clé 'IntPtr' au lieu de 'IntPtr*'
Merci, votre suggestion est beaucoup mieux. J'ai mis à jour ma réponse en conséquence.
OriginalL'auteur simonc
Si la bibliothèque C++ de la fonction renvoie
char*
, C# code de la traiter commeIntPtr
etMarshal.PtrToStringAnsi()
va la convertir en C#string
.OriginalL'auteur Thach Van
Si vous avez besoin de plus de vitesse, vous pouvez également faire une dangereux de lire:
Lorsque vous ajoutez le
unsafe
méthode, VS vous demande si vous souhaitez autoriser dangereux code du projet: répondre oui. Ou manuellement "propriétés du projet/construire/autoriser le code unsafe".OriginalL'auteur Soleil