Обратный звонок в VBScript из C # - PullRequest
2 голосов
/ 25 июня 2009

Мне бы хотелось узнать, можно ли вызвать функцию в VBScript из C #. Позвольте мне попытаться уточнить. Я использую приложение (Quick Test Professional или «QTP»), которое автоматизирует другое приложение, в основном с использованием VBScript. Существует возможность с помощью надстройки модели расширить функциональность теста, написав надстройки для приложения тестирования (QTP), которые являются сборками .NET. Основной рабочий процесс заключается в том, что тесты VBScript автоматизируют тестовое приложение и могут вызывать методы класса в расширяемости, добавляемой в сборку, для выполнения более сложных задач. Эта часть отлично работает.

Что я хотел бы знать, так это то, что мой C # -код (в расширении, добавляемом в сборку) может вызывать функцию в VBScript. Я не думаю, что инфраструктура тестового приложения (QTP) явно поддерживает это, поэтому мне интересно, есть ли способ сделать это, используя стандартные методы взаимодействия. Я на полпути думал об использовании GetRef (), чтобы получить ссылку на интересующую функцию VBScript, передав ее в качестве параметра методу, который я вызываю в надстройке расширяемости (я подозреваю, что у меня возникнут проблемы с маршалингом даже на этом этапе?) и затем в коде C # моей добавляемой расширяемости каким-то образом вызовите метод для этого объекта; это то, где я полностью потерян (так как я не знаю, как это сделать без необходимой информации о типах, обычно используемой в отражении).

Я думаю, что это может быть невозможно, но хотел бы получить подтверждение, если это так.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 28 августа 2017

В конце концов, не так сложно, но выяснить это было сложнее В vbscript установить a = getref В c # объявляем ref как объект 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;
 }

А потом в 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
0 голосов
/ 25 июня 2009

Это крепкий орешек.

Вы МОЖЕТЕ попытаться написать обработчик событий на стороне VBScript для компонента .NET и вызвать событие на стороне .NET, когда хотите, чтобы функция вызывалась.

Только предупреждаем, что это может даже не работать, поскольку это действительно зависит от механизма сценариев QTP. И даже если это так, не удивляйтесь, если это станет разочарованием.

См. Примеры по WSH и обработке событий http://msdn.microsoft.com/en-us/library/ms974564.aspx Опять же, это, вероятно, не относится к QTP, но дает представление о потенциальном подходе к проблеме.

Редактировать: Дополнительная ссылка, которая может или не может помочь!

http://www.west -wind.com / презентации / dotnetfromVfp / DotNetFromVfp_EventHandling.asp

0 голосов
/ 25 июня 2009

Как VBScript вызывает код C #? Я подозреваю, что это действительно вызов QTP, а QTP вызывает код C #. В этом случае только QTP мог бы вызвать VBScript обратно.

При каких обстоятельствах ваш код C # перезвонит? Я сомневаюсь, что VBScript можно вызывать асинхронно.

...