【问题标题】:Calling back to VBScript from C#从 C# 回调到 VBScript
【发布时间】:2009-06-25 16:26:18
【问题描述】:

我想知道是否可以从 C# 调用 VBScript 中的函数。让我试着澄清一下。我正在使用自动化另一个应用程序的应用程序(Quick Test Professional 或“QTP”),主要使用 VBScript。通过插件模型,可以通过将插件写入作为 .NET 程序集的测试应用程序 (QTP) 来扩展测试功能。基本工作流程是 VBScript 测试自动化测试应用程序,并且可以在可扩展性添加程序集中调用类上的方法来做更复杂的事情。这部分工作正常。

我想知道的是我的 C# 代码(在程序集中的可扩展性添加中)是否可以回调 VBScript 中的函数。我不认为测试应用程序框架(QTP)明确支持这一点,所以我想知道是否有任何方法可以使用标准互操作技术来做到这一点。我正在考虑使用 GetRef() 来获取对感兴趣的 VBScript 函数的引用,将其作为参数传递给我在可扩展性插件中调用的方法(我怀疑即使在这一点上我也会遇到编组问题?)然后在我的可扩展性添加的 C# 代码中,以某种方式调用此对象的方法;这是我完全迷失的地方(因为如果没有反射中通常使用的必要类型信息,我不知道该怎么做)。

我认为这可能是不可能的,但如果是这样的话,我想确认一下。

谢谢!

【问题讨论】:

    标签: c# interop vbscript callback qtp


    【解决方案1】:

    最终没那么难,但找到它更难 在 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
    

    【讨论】:

    • 这对我有用,但我必须将 InvokeMember 的最后一个参数设置为 nullptr。
    【解决方案2】:

    VBScript如何调用C#代码?我怀疑它真的是在调用QTP,而QTP是在调用C#代码。在这种情况下,只有 QTP 可能会回调 VBScript。

    在什么情况下你的 C# 代码会回调?我怀疑VBScript可以异步回调。

    【讨论】:

    • 不知道VBScript如何调用C#代码。如果我不得不猜测,认为你是对的;它可能依赖于 QTP,而 QTP 正在调用 C# 代码。理想情况下,我的 C# 代码会回调 VBScript 方法,以响应 C# 代码订阅的控件中引发的事件。
    • 是的,据我所知,这真的行不通。 VBScript 是一种脚本语言。它不理解事件或多线程,我敢肯定它不知道它可能被异步调用。考虑一下:你能用纯 VBScript 做到这一点吗?有一个 VBSCript 脚本调用一个稍后“回调”原始函数的 VBScript 函数吗?我看不出有什么办法。
    • 是的,VBScript 确实以不同的方式理解事件,具体取决于托管应用程序和使用的脚本引擎; hythlodayr 引用了下面的几个网页。 (第一个参考最合适)。
    【解决方案3】:

    这是一个强硬的人。

    您可能想尝试在 VBScript 端为 .NET 组件编写事件处理程序,并在希望调用该函数时在 .NET 端引发事件。

    请注意,它甚至可能不起作用,因为它确实取决于 QTP 的脚本引擎。即使它应该这样做,如果它变成一种挫败感,也不要感到惊讶。

    查看有关 WSH 和事件处理的示例 http://msdn.microsoft.com/en-us/library/ms974564.aspx 同样,这可能不适用于 QTP,但它可以让您了解解决问题的潜在方法。

    编辑:可能有帮助也可能没有帮助的附加链接!

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

    【讨论】:

    • 它是 VBScript。有活动吗?
    • 我之前也有同样的想法,发现你引用的相同(第一页)页面。但是,我不认为 QTP 正在使用 WSH,并且在我的场景中似乎没有其他方法(在 MSDN 参考中)订阅 VBScript 中的事件。我认为这是因为我无法影响传递给脚本引擎的内容(因为我不是 QTP),因此无法使用“自动”和调用函数方法。
    • @John:事件 handling 已经存在了很长一段时间(想想 Internet Explorer)。但是它的支持是不一致的,并且很大程度上依赖于脚本引擎的实现。 @Notre:那么对不起。供应商可能更有能力为您提供答案。
    • 供应商并没有提供太多帮助(在我向他们提出的相关问题中),我在他们的文档中找不到任何表明它受支持的内容。这就是为什么我想从更一般的互操作的角度来看,我会在这里发帖看看是否有任何我可能遗漏的东西。
    • 我完全忘记了 Object_EventName。即便如此,这也适用于 COM 事件。考虑到很少有人记得 COM 事件,从 C# 调用这将有点混乱,并且是一个维护问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多