2009-06-25 5 views
2

J'aurais aimé savoir s'il est possible d'appeler une fonction dans VBScript à partir de C#. Laissez-moi essayer de clarifier. J'utilise une application (Quick Test Professional ou "QTP") qui automatise une autre application, principalement en utilisant VBScript. Il est possible, via un modèle d'ajout, d'étendre la fonctionnalité de test en écrivant des compléments à l'application de test (QTP) qui sont des assemblys .NET. Le workflow de base est que les tests VBScript automatisent l'application de test et peuvent appeler des méthodes sur une classe dans l'assembly d'extension d'extension pour effectuer des opérations plus complexes. Cette partie fonctionne bien.Rappel à VBScript du C#

Ce que je voudrais savoir, c'est s'il est possible que mon code C# (dans l'extension add in assembly) rappelle à une fonction dans le VBScript. Je ne pense pas que le framework d'application de test (QTP) supporte explicitement cela, donc je me demande s'il y a moyen de le faire en utilisant des techniques d'interopérabilité standard. Je pensais à l'aide de GetRef() pour obtenir une référence à la fonction VBScript d'intérêt, en passant cela comme un paramètre à une méthode que j'appelle dans l'addin d'extension (je suppose que je rencontrerais des problèmes de marshaling même à ce point?) puis dans le code C# de mon extensibilité ajouter, en quelque sorte appeler une méthode sur cet objet; c'est là que je suis complètement perdu (puisque je ne sais pas comment le faire sans les informations de type nécessaires normalement utilisées en réflexion).

Je pense que ce n'est peut-être pas possible, mais j'aimerais une confirmation si c'est le cas.

Merci!

Répondre

0

Comment VBScript appelle le code C#? Je soupçonne qu'il fait vraiment appel à QTP, et QTP appelle le code C#. Dans ce cas, seul QTP pourrait éventuellement rappeler le VBScript.

Dans quelles circonstances votre code C# rappelle-t-il? Je doute que VBScript puisse être rappelé de manière asynchrone.

+0

Je ne sais pas comment VBScript appelle le code C#. Si je devais deviner, pense que tu as raison; il est probable qu'il se base sur QTP et QTP appelle le code C#. Idéalement, mon code C# rappelait la méthode VBScript en réponse à un événement déclenché dans le contrôle auquel le code C# était abonné. –

+0

Oui, ça ne va vraiment pas marcher, d'après ce que je peux voir.VBScript est un langage de script. Il ne comprend pas les événements, ou multi-threading, et je suis sûr qu'il n'a aucune idée qu'il pourrait être appelé de manière asynchrone. Considérez: pourriez-vous faire cela avec juste VBScript pur? Un script VBSCript appelle-t-il une fonction VBScript qui "rappelle" l'original plus tard? Je ne vois aucun moyen de le faire. –

+0

Oui, VBScript comprend les événements de différentes manières, en fonction de l'application d'hébergement et du moteur de script utilisé; hythlodayr fait référence à quelques pages Web ci-dessous. (La première référence est la plus appropriée). –

0

C'est un toughie.

Vous pouvez essayer d'écrire un gestionnaire d'événements du côté VBScript pour le composant .NET et déclencher un événement du côté .NET lorsque vous souhaitez appeler la fonction. Juste pour être averti, il peut même ne pas fonctionner, car il dépend vraiment du moteur de script de QTP. Et même si c'est le cas, ne soyez pas surpris si cela devient un exercice de frustration.

Voir les exemples sur WSH et la gestion des événements http://msdn.microsoft.com/en-us/library/ms974564.aspx Encore une fois, cela ne s'appliquera probablement pas à QTP, mais c'est pour vous donner une idée de l'approche potentielle du problème.

Editer: Lien additionnel qui peut ou ne peut pas aider!

http://www.west-wind.com/presentations/dotnetfromVfp/DotNetFromVfp_EventHandling.asp

+0

C'est VBScript. A-t-il des événements? –

+0

J'avais déjà eu la même pensée, et trouvé la même (première) page que vous avez référencée. Cependant, je ne pense pas que QTP utilise WSH et aucune des autres approches (dans la référence MSDN) pour s'abonner à des événements dans VBScript ne semble fonctionner dans mon scénario. Je pense que c'est parce que je ne peux pas influencer ce qui est passé dans le moteur de script (comme je ne suis pas QTP), et donc utiliser l'approche 'automagic' et les fonctions d'appel ne peuvent pas être utilisées. –

+0

@ John: Event * handling * existe déjà depuis longtemps (pensez à Internet Explorer). Mais son support est incohérent et dépend largement de l'implémentation du moteur de script. @ Notre: Désolé, alors. Le fournisseur peut être mieux équipé pour vous donner une réponse. – hythlodayr

2

En fin de compte pas si difficile, mais trouver dehors était plus difficile VBscript défini a = getRef En C# déclare l'arbitre comme un objet https://community.saas.hpe.com/t5/Unified-Functional-Testing/C-compile-on-the-fly-thru-dotnetfactory/m-p/1611299#M22811

private object _UFTCallBackFunction = null; 

public int callMeBack2() 
{ 
string[] retParts = {"Yep this is value 1"}; 
_UFTCallBackFunction.GetType().InvokeMember("", 
    System.Reflection.BindingFlags.InvokeMethod, null, 
_UFTCallBackFunction, retParts); 
return 0; 
} 

public void InitUFTCallBack(object UFTCallBackFunction) 
{ 
_UFTCallBackFunction = UFTCallBackFunction; 
} 

Et puis en vbs

Set oCallMe = GetRef("CallMeBackWithAParameter") 
oTestCom.InitUFTCallBack(oCallMe) 
oTestCom.callMeBack2() 
Function callMeBackWithAParameter(P1) 
print "I wass called back from C# having value " & P1 
End Function 
+1

cela a fonctionné pour moi mais j'ai dû mettre le dernier argument de InvokeMember à nullptr. – Dmitry