51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 12613|回复: 20
打印 上一主题 下一主题

[求助] 在QTP中引用C#编写的dll的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-4-26 16:29:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
In QTP script, i want to use external dll which is written by C# language.
I produced a very simple dll, pls see the following code

namespace ADDFun
{
/// <summary>
/// Summary description for Class1.
/// </summary>
public class ADDFun
{
public int AddFunction()
{
return 1;
}
}
}

Then in the QTP, i used it as the following way
Extern.Declare micInteger,"AddFunction", "C:\ADDFun.dll", "AddFunction"

The function has no parameter, and it will return a number.

Then i ran this script, a error occured, it said that "Invalid procedure call or argument" .

Can anyone help me?
Thanks
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-4-26 17:12:22 | 只看该作者
Probably it doesn't work that simply as you thought.sdlkfj2

To call an external function through Extern.Declare within a QTP test script is applicable for those functions like Windows API.
But it won't work for a C# dll like you developed because no function is exported directly from that dll.

Actually, the function AddFunction is exported through a public method in the class ADDFun from the dll.
Suppose I want to call the method AddFunction in another C# application, first I would import ADDFun.dll into that application, And then in the application, I would implement several statements like below:
//Declare an object instance with ADDFun class
ADDFun objADDFun;
//Call the function from the object instance
objADDFun.AddFunction();
It's impossible to do the same in a QTP script.

Maybe you can find a way to directly export a simple function instead of a class in a C# dll. Otherwise, you won't be able to call the function.
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2007-4-26 18:02:45 | 只看该作者
靠,用英语来贼啊
看了半天,看到最后一句
Otherwise, you won't be able to call the function.
sdlkfj4
我现在用VB6.0也不行啊
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2007-4-26 22:19:11 | 只看该作者
在那个用C#开发的dll里面导出的不是一个简单的Function,而是一个Class,本来想导出的Function是那个Class的一个Public方法。
在其他应用程序里面,只能先声明这个类的对象实体,然后才能调用那个方法。显然QTP是不支持的,QTP只能引用包含了类似WinAPI的外部dll。
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2007-4-27 10:16:18 | 只看该作者
Please see other people feedback:

It should be signed DLL and registered in GlobalCashe

[for Extern.Declare calling]

Or:

written as COM [for calling via Object Creation]

If you can code on C# - there is new possibility in QTP 9.1 - DotNetFactory object. It's amazing and powerful.
You can write DLL as well as use direct C# coding in TestCase with instantiating C# public classes.
Play with that.

Janna
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2007-4-27 12:16:45 | 只看该作者
SQAForum里面有好几个主题贴都深入讨论了QTP如何调用Dll。
不同的Dll输出方式是有区别的,QTP引用dll可以分成两部分来看,Dll输出什么,QTP如何调用。我觉得最初那段C#代码输出的不是一般意义的函数,而是一个类,该类包含了一个方法是希望被QTP调用的。
QTP9.1里面的DotNetFactory方法,可以闯将已经注册的类型。但是前提是用C#开发出来的类型要注册到系统里面。
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2007-4-30 09:41:10 | 只看该作者
呵呵,小阎为什么发帖用英文?
C#没用过帮不了你sdlkfj7


原帖由 Alexander 于 2007-4-26 16:29 发表
In QTP script, i want to use external dll which is written by C# language.
I produced a very simple dll, pls see the following code

namespace ADDFun
{
///
/// Summary description for Cla ...
回复 支持 反对

使用道具 举报

该用户从未签到

8#
 楼主| 发表于 2007-4-30 10:57:54 | 只看该作者

最终解决方案

其实摸索这个问题好像是很难,但是其实很简单,大家来看看我的代码
using System;
using System.Collections.Generic;
using System.Text;

namespace ClassLibrary1
{
    public class Class1
    {
        public int Test()
        {
            return 10;
        }
    }
}

下面就是关键了,
1.必须用VS2005 的命令行 键人: sn -k "XXXX\*.snk" 其中X,*是路径和文件名
2.打开AssemblyInfo.cs文件, 键入
  [assembly: AssemblyKeyFile("D:\\Projects\\MyTest\\Dll\\ClassLibrary1\\ClassLibrary1\\bin\\Debug\\mykey.snk")]
3.Build
4.把这个dll文件靠本到目标机子中的 system\assembly文件夹中
5.打开QTP 9.2(好像9.0版本及以上都可以)
  键入 :
   Set myclass=DotNetFactory.CreateInstance("ClassLibrary1.Class1","ClassLibrary1")
  c1=myclass.Test()
  MsgBox c1
  显示是10

结论: 大家看是不是很简单,主要是强名称的问题,对于非强名称的dll,现在还不知道有什么办法调用。
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2007-4-30 11:59:09 | 只看该作者
呵呵 强人啊
顶一下
马上下来试试
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2007-6-29 16:25:11 | 只看该作者
厉害
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2007-7-5 17:01:32 | 只看该作者
学习了,顶
回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 2007-8-20 10:42:10 | 只看该作者
你们试过能行???
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2007-8-20 10:42:19 | 只看该作者
昨我试过不行!
回复 支持 反对

使用道具 举报

该用户从未签到

14#
发表于 2007-8-20 10:47:13 | 只看该作者
1.必须用VS2005 的命令行 键人: sn -k "XXXX\*.snk" 其中X,*是路径和文件名
我做.它说不支持此命令
Set myclass=DotNetFactory.CreateInstance("ClassLibrary1.Class1","ClassLibrary1")
它说cannot load assembly qtpinit
具体此DLL要放在哪里.. 可以在代码那里指定它放的位置不?
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2007-8-20 11:02:11 | 只看该作者
问题解决了.
回复 支持 反对

使用道具 举报

该用户从未签到

16#
发表于 2007-8-21 23:59:34 | 只看该作者
请问 QTP 里面的 对象模型 在 C++ 里面怎么引用啊?

谢谢了哈!!
回复 支持 反对

使用道具 举报

该用户从未签到

17#
发表于 2007-10-16 15:42:30 | 只看该作者
Cannot load Assembly ClassLibrary1
我这里这样提示~啥情况?>
我用QTP9.0

[ 本帖最后由 milan330330 于 2007-10-16 15:45 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

18#
发表于 2007-11-1 12:04:01 | 只看该作者
VC中,这种类的调用,好象是实现不了,不知道大家有什么好的办法.看这个贴子.
http://bbs.51testing.com/thread-95390-1-1.html
回复 支持 反对

使用道具 举报

该用户从未签到

19#
发表于 2008-2-28 18:45:05 | 只看该作者

回复 8# 的帖子

我使用强名称,用sn -v XX.dll 察看,已经成功,为什么在qtp调用的时候提示:文件格式不正确?希望你能予以解答
回复 支持 反对

使用道具 举报

该用户从未签到

20#
发表于 2008-2-28 18:46:41 | 只看该作者
同志们谁能帮助解决一下
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /2 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-6-5 13:11 , Processed in 0.083873 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表