2010-01-20 6 views
0

J'ai une DLL C# qui, lorsque la méthode principale est appelée, ouvre un formulaire Windows. Cette DLL est actuellement accessible via VBA par une application de fournisseur. Le problème est que lorsque la DLL est appelée et le formulaire s'ouvre, l'utilisateur perd la capacité d'interagir avec l'application du fournisseur. J'espérais que si je pouvais modifier la dll pour supporter un appel asynchrone, alors le contrôle pourrait être retourné à l'application appelante pour permettre à l'utilisateur de tourner les pages, zoomer ou dézoomer, etc. Puis une fois que l'utilisateur a terminé la pop-up forme nous pourrions avoir un rappel ou quelque chose pour retourner l'information aux personnalisations de l'application vba.Appel d'une méthode asynchrone C# à partir d'une application VB6

+0

Cela devrait aider: http://www.codeproject.com/KB/vbscript/AsyncSample.aspx –

Répondre

2

Plutôt que de faire l'appel asynchrone à partir de VB, il serait beaucoup plus facile de modifier le code C# pour ouvrir la fenêtre de manière asynchrone, puis revenir.

Vous pouvez le faire simplement en changeant la ligne qui ouvre la fenêtre de .ShowDialog() à .Show().

Évidemment, cela peut ne pas être une option si vous n'avez pas accès au code de la DLL C#, mais j'ai pensé que je le suggérerais.


Si vous décidez de changer d'utiliser Show() au lieu de ShowDialog() vous pourriez avoir à gérer différemment le résultat de dialogue.

Vous n'êtes nouveau code ressemblera à quelque chose comme ceci:

MyForm win = new MyForm(); 
win.Show(); 

Une boîte de dialogue non modale ne bloque pas le code d'appel, de sorte que votre code d'appel continuera sans attendre un résultat. La méthode la plus simple pour gérer cela consiste à attacher un gestionnaire d'événements à la forme .OnClosed event du formulaire. Cela sera ensuite déclenché lorsque l'utilisateur ferme le formulaire.

MyForm win = new MyForm(); 
win.OnClosed += new EventHandler<FormClosedEventArgs>(YourEventHandlerMethod) 
win.Show(); 

Vous pouvez ajouter une propriété publique booléen à la forme (avec un setter privé) que vous définissez en interne lorsque les boutons ok/annuler sont pressés (En plus d'appeler la méthode proche). Vous pouvez ensuite vérifier cette propriété après la fermeture du formulaire depuis votre gestionnaire on on closed. (La propriété de l'expéditeur sera votre référence au formulaire, il vous suffira de le convertir au type correct en premier).

donc votre méthode de gestionnaire d'événements ressemblera à ceci:

private void EventHandler<FormClosedEventArgs> YourEventHandlerMethod(Object sender, FormClosedEventArgs e) 
{ 
    MyForm f = (MyForm)sender; 
    bool result = f.TheResultProperty; 

    // Now do your callback. 
} 

Enfin, vous avez maintenant un code qui court après la forme ferme, et a accès aux formulaires de résultat, il vous suffit de laisser votre VBA le code sait que c'est prêt - je vous laisse le soin de le faire.

+0

J'ai regardé cela il y a quelque temps et le problème que j'ai vu alors était que j'utilisais le résultat du dialogue pour savoir si le l'utilisateur a annulé le formulaire ou cliqué sur le X dans le coin, etc. J'y reviendrai. – Brian

+0

Il sera beaucoup plus facile que de modifier votre code VBA pour appeler async. Je vais modifier ma réponse pour inclure quelques conseils pour gérer la différence entre Show & ShowDialog. –

+0

@Brian. Voir mise à jour. –

Questions connexes