2017-09-21 2 views
1

Je dois appeler une méthode native d'une DLL non gérée à partir de C#. Le code source DLL n'est bien sûr pas disponible (fourni par un "tiers").Comment implémenter un rappel en C# pour récupérer le code retour d'une méthode DLL native avec plusieurs arguments

méthode de DLL native est censé accepter deux arguments et renvoie un code de nombre entier (natif):

MyDLLNativeMethod (string filename, int returnCode)

Le premier argument de la méthode de DLL native est une chaîne (filename) & second doit être une "référence" pour rassembler le code retour après l'exécution. Je suis confus sur la façon d'obtenir le code de retour. Les appels de DLL fonctionnent correctement, produisant des fichiers attendus basés sur le premier argument.

Comment est-ce que je devrais mettre en application le rappel désiré pour effectuer l'opération sur différentes valeurs de codes de retour récupérées?

// ~~~~~~~~~~~~~~~~~~~~ 
// Main entry point 
// ~~~~~~~~~~~~~~~~~~~~ 
namespace MyProject 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyDLLCaller _dllcaller = new MyDLLCaller(); 
      _dllcaller.MyDLLNativeMethod("test_file.txt"); 
     } 
    } 
} 

// ~~~~~~~~~~~~~~~~~~~~ 
// DLL calling class 
// ~~~~~~~~~~~~~~~~~~~~ 
    namespace MyProject 
    { 
     class MyDLLCaller 
     { 
      // DLL Loading  
      [DllImport(@"C:\test\mydll.dll")] 
      public static extern int MyDLLNativeMethod(string _filename); 

      // Native DLL method pseudo code : 
      // MyDLLNativeMethod(string filename, int returncode). 
     } 
    } 

Merci à l'avance

Répondre

1

Si le code de retour est le second paramètre, je pense que vous devriez utiliser out mot-clé pour ceci:

int returncode = 0; 

[DllImport(@"C:\test\mydll.dll")] 
public static extern int MyDLLNativeMethod(string _filename, out int returncode); 

if(returnCode != 0) 
{ 
    // something went wrong 
} 

Essayez avec un certain fichier que vous connaissez doit renvoyer le code d'erreur.

+0

Est-ce que cela fonctionne pour vous? Voulez-vous marquer la réponse comme acceptée? – mortb

0

Si la déclaration ci-dessus pour l'appel externe fonctionne avec votre bibliothèque, vous obtenez le code de retour de l'appel.

var retCode = _dllcaller.MyDLLNativeMethod("test_file.txt"); 
+0

En utilisant la déclaration ci-dessus: public statique externe int MyDLLNativeMethod (string _filename, out int returncode); 'Visual Studio se plaint maintenant de" "Il n'y a pas d'argument correspondant au paramètre formel returncode lors de l'appel de cette méthode Paramètre "_filename": '_dllcaller.MyDLLNativeMethod (" test_file.txt ");' – donmelchior