2 votes

Appeler le VBScript à partir de C#

J'aimerais savoir s'il est possible d'appeler une fonction en VBScript à partir de C#. Je vais 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 complémentaire, d'étendre la fonctionnalité de test en écrivant des modules complémentaires à l'application de test (QTP) qui sont des assemblages .NET. Le flux de travail de base est le suivant : les tests VBScript automatisent l'application de test et peuvent appeler des méthodes sur une classe dans l'assemblage add-in d'extensibilité pour faire des choses plus compliquées. Cette partie fonctionne bien.

J'aimerais savoir s'il est possible pour mon code C# (dans l'assemblage d'extension) de rappeler une fonction dans le VBScript. Je ne pense pas que le cadre d'application de test (QTP) prenne explicitement en charge cette fonction, et je me demande donc s'il existe un moyen de le faire en utilisant les techniques d'interopérabilité standard. Je pensais à moitié utiliser GetRef() pour obtenir une référence à la fonction VBScript qui m'intéresse, la passer comme paramètre à une méthode que j'appelle dans l'addin d'extensibilité (je pense que je rencontrerais des problèmes de marshaling même à ce stade ?) et ensuite, dans le code C# de mon addin d'extensibilité, appeler d'une manière ou d'une autre une méthode sur cet objet ; c'est là que je suis complètement perdu (puisque je ne sais pas comment faire sans les informations de type nécessaires normalement utilisées dans la réflexion).

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

Merci !

2voto

junkew Points 91

En fin de compte, ce n'est pas si difficile, mais le découvrir l'était plus. En vbscript set a=getref En c#, déclarer la référence 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 ensuite dans 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

0voto

John Saunders Points 118808

Comment le VBScript appelle-t-il le code C# ? Je soupçonne qu'il s'agit en fait d'un appel à QTP, et que QTP appelle le code C#. Dans ce cas, seul QTP pourrait éventuellement rappeler le VBScript.

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

0voto

hythlodayr Points 2015

C'est difficile.

Vous pourriez essayer d'écrire un gestionnaire d'événements dans la partie VBScript pour le composant .NET et de déclencher un événement dans la partie .NET lorsque vous voulez que la fonction soit appelée.

Sachez simplement que cela peut ne pas fonctionner, car cela dépend vraiment du moteur de script de QTP. Et même si cela devait fonctionner, ne soyez pas surpris si cela devient un exercice de frustration.

Voir les exemples sur le WSH et le traitement 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.

Edit : Lien supplémentaire qui peut ou ne peut pas aider !

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X