在vbscript中调用C# dll

6

我正在尝试从QTP(使用vbscript)调用C# dll。我已经尝试了许多方法,但都没有成功:

  • Visual Studio 2010
  • 创建C#类库(st.dll)

代码:

using System;
using System.Collections.Generic;
using System.Text;   

namespace st
{
    public class Class1
    {
        public static int GetValue()
        {
            return 34;
        }
    }
}
  • regasm /codebase st.dll
    • 失败,因为它不是有效的.NET程序集。

在QTP/vbscript中,我尝试了以下方法:

  • extern.Declare micInteger, "GetValue", "e:\st.dll", "GetValue"
    • 返回消息:'无效的过程调用或参数'

无论使用哪种方法,我都非常感谢您能提供如何从.vbs文件中调用c# dll的任何见解。


你把它标记为COM可见了吗?http://msdn.microsoft.com/zh-cn/library/ms182157(VS.80).aspx - Marc Gravell
我已经进入“属性”>“程序集信息”,并勾选了“使程序集COM可见”。仍然出现上述错误。 - Edward Leno
仍在挣扎中...我移除了 'static' 关键字,以管理员身份运行了 VS 2010,并开启了属性 > 生成 > 注册 COM 互操作。 - Edward Leno
对于像我这样不知道 Qtp 是什么的人来说,它是“Quick Test Professional”的缩写,而这个网页http://www.advancedqtp.com/似乎稍微谈了一下它。 - flq
3个回答

9
我能通过以下步骤使其工作:

在VS 2010中创建一个新的C# dll。

namespace st4
{
    public class st4_functions
    {
        public int GetValue()
        {
            return 34;
        }
    }
}

在QTP中我添加了以下行:

Set obj = DotNetFactory.CreateInstance("st4.st4_functions", "c:\\st4.dll")
MsgBox obj.GetValue()

感谢所有回复我的问题的人。虽然我没有采用COM解决方案,但这让我想到我可以继续使用.NET并得出这个解决方案。大家做得很好!
编辑:
我创建了一篇博客文章详细介绍了步骤并提供了额外的信息:

http://www.solutionmaniacs.com/blog/2012/5/29/qtp-calling-c-dll-in-vbscript.html


这肯定比通过COM更好。 :-) - Christian Hayter
我猜 DotNetFactory.CreateInstance() 是 QTP 特有的? - StayOnTarget

1
正如Marc所说,但我认为这值得回答。如果确保您的dll将通过COM机制可用,那么您的脚本应该能够使用CreateObject等来调用它。

如何为COM互操作注册.NET程序集


我将汇编设置为COM可见。在QTP / vbs中,我添加了以下内容: Dim example Set example = CreateObject(“st.Class1”) 但我得到一个错误:ActiveX组件无法创建对象:“st.Class1” - Edward Leno

1

你的函数是静态的。静态类成员不能与接口成员匹配,如果它无法实现.NET接口,那么它肯定也无法实现COM接口。


我已经移除了 static 关键字。问题依旧。有没有关于如何在没有 QTP 的情况下让简单类工作的教程?我正在寻找最简单的示例,以便理解我需要做什么。 - Edward Leno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接