2008-11-13 7 views
9

J'écris l'application A et la DLL B, toutes deux en C# .NET. Comment puis-je effectuer les opérations suivantes:C# callback de DLL

  1. A appelle fonction B
  2. Voulez-vous utiliser B délégué/rappel pour mettre à jour le statut dans l'interface utilisateur de A

C'est pas à propos BackgroundWorker .. partie .que fonctionne très bien dans A. ce que je ne vois pas comment laisser B savoir ce que la fonction à appeler à A.

Répondre

6

Vous avez deux options. Le plus commun est d'avoir un événement en B et d'avoir votre UI en A s'abonner à cet événement. B déclenche alors cet événement.

La deuxième option consiste à passer à un délégué de A en tant que paramètre de l'appel de méthode en B. B peut alors invoquer ledit délégué.

+0

Je voulais utiliser la deuxième option, mais la syntaxe m'a dérouté. –

+0

Il vous manque une troisième option. Vous pouvez créer un délégué dans A pour faire l'ombre à la méthode B, de sorte que B n'a jamais besoin d'en savoir plus. Idéal pour appeler des méthodes dans des bibliothèques tierces de manière asynchrone, ce qui normalement ne le supporte pas. –

+0

J'ai fini par essayer les deux premières options. La syntaxe pour la seconde était plus propre dans mon cas. Merci! –

1

passe dans l'objet de rappel à l'appel A faire à B. Utilisation d'une interface (ou les bibliothèques étroitement liés). Assurez-vous que l'objet de rappel est sensible au thread et thread sécurisé.

12

Pour développer la réponse de Rob Prouse, vous devez déclarer un délégué et passer ensuite une méthode de correspondance en elle.

En B:

public delegate void CallbackDelegate(string status); 

public void DoWork(string param, CallbackDelegate callback) 
{ 
    callback("status"); 
} 

En A:

public void MyCallback(string status) 
{ 
    // Update your UI. 
} 

Et quand vous appelez la méthode:

B.DoWork("my params", MyCallback); 
+1

Merci! Je venais juste de le faire, donc c'est bien d'avoir votre confirmation. –

+0

Bien sûr, si A et B sont dans des assemblages différents, vous devrez peut-être coller le délégué dans son propre assemblage pour éviter les problèmes de dépendance récursifs. – Soraz

+0

Si le délégué est déclaré dans B, comment obtiendriez-vous une dépendance circulaire? –

1

Si vous contrôlez B, Rob Prouse ou les réponses de Brody fonctionne bien.

Mais si vous ne pouvez pas changer B du tout? Dans ce cas, vous pouvez toujours envelopper une méthode dans un délégué de votre choix, tant que sa signature correspond à celle de la signature de la méthode cible.

Ainsi, supposons que vous avez une instance de classe B nommée avec une méthode publique nommée b() (de l'ensemble dll B, bien sûr). La classe A dans l'application A peut l'appeler de manière asynchrone comme ceci:

public class A 
{ 
    delegate void BDelegate(); 

    public void BegineBMethod() 
    { 
     BDelegate b_method = new BDelegate(B.b); 
     b_method.BeginInvoke(BCallback, null); 
    } 

    void BCallback(IAsyncResult ar) 
    { 
     // cleanup/get return value/check exceptions here 
    } 
}