C# de rappel à partir de la DLL
Je suis en train d'écrire l'Application et DLL B, à la fois dans C#.NET. Comment puis-je effectuer les opérations suivantes:
- Les appels de fonction dans B
- Souhaitez B pour utiliser la délégué/rappel de mise à jour de statut dans l'INTERFACE utilisateur d'Un
C'est pas sur BackgroundWorker...cette partie fonctionne bien en A. Ce que je ne peux pas voir, c'est comment permettre à B de savoir quelle est la fonction à appeler dans A.
OriginalL'auteur | 2008-11-13
Vous devez vous connecter pour publier un commentaire.
De s'étendre sur les Rob Prouse de réponse, vous devez déclarer un délégué et puis passer de la méthode d'appariement.
En B:
Dans Un:
Et lorsque vous appelez la méthode:
Bien sûr, si A et B sont dans différents ensembles, vous pouvez avoir à coller les le délégué dans sa propre assemblée pour éviter récursive de problèmes de dépendance.
Si le délégué est déclaré dans B, comment voulez-vous obtenir une dépendance circulaire?
Je n'ai mis le délégué de la définition dans son propre DLL/assemblée, qui fonctionnait bien pour moi.
Vous avez oublié d'instancier le gestionnaire de rappel
OriginalL'auteur Jeromy Irvine
Vous avez deux options. La plus courante est d'avoir un événement dans B et avoir votre INTERFACE utilisateur de s'abonner à l'événement. B alors que des incendies de l'événement.
La deuxième option est de passer dans un délégué d'un comme un paramètre à l'appel de la méthode dans B. B peut alors Invoquer que délégué.
Il vous manque une troisième option. Vous pouvez créer un délégué dans l'ombre, la méthode B, de sorte que B n'a jamais besoin de rien savoir. Idéal pour l'appel de méthodes dans les bibliothèques de tiers asynchonously qui normalement n'a pas de soutien.
J'ai fini par tenter à la fois de la première et de la deuxième options. La syntaxe pour la deuxième était plus propre dans mon cas. Merci!
OriginalL'auteur Rob Prouse
Passer dans le rappel de l'objet de l'appel d'Un faire à B. à l'aide d'une interface (ou étroitement liés bibliothèques). Assurez-vous que l'objet de rappel est thread courant et thread-safe.
OriginalL'auteur Brody
Si vous contrôlez B, puis Rob Prouse ou Brody réponses fonctionnera très bien.
Mais que faire si vous ne pouvez pas changer de B? Dans ce cas, vous pouvez toujours placer une méthode dans un délégué de votre propre fabrication, aussi longtemps que la signature correspond à celle de la signature de la cible de la méthode.
Donc, disons que vous avez une instance de classe nommé B avec une méthode publique nommé b() (à partir du dll assemblée, bien sûr). De catégorie A en Une application peut appeler de manière asynchrone comme ceci:
OriginalL'auteur Joel Coehoorn