Calling C# dll in vbscript
Asked Answered
G

3

6

I am trying to call a C# dll from QTP (uses vbscript). I have tried a number of things with no success:

  • Visual Studio 2010
  • Create C# class libary (st.dll)

code:

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

namespace st
{
    public class Class1
    {
        public static int GetValue()
        {
            return 34;
        }
    }
}
  • regasm /codebase st.dll
    • fails 'because it is not a valid .NET assembly'

In QTP/vbscript, I have tried

  • extern.Declare micInteger, "GetValue", "e:\st.dll", "GetValue"
    • Returns message: 'Invalid procedure call or argument'

Regardless of QTP, I would greatly appreciate any insight on how to call the c# dll from a .vbs file.

Generalist answered 20/9, 2009 at 20:41 Comment(4)
Have you marked it as COM-visible? msdn.microsoft.com/en-us/library/ms182157(VS.80).aspxStinking
I have gone into Properties > Assembly Information and checked 'Make assembly COM-Visible. Still get the above errors.Generalist
Still struggling ... I removed the 'static' keyword, ran VS 2010 as admin and turned on Properties > Build > Register for COM Interop.Generalist
For those, like, me, who didn't knwo what Qtp was...it's TLA for "Quick Test Professional" and this page here...advancedqtp.com seems to talk a bit about it.Butler
G
9

I was able to get this working by doing the following:

Create a new C# dll in VS 2010.

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

In QTP I added the following lines:

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

Thanks to all that responded to my problem. Though I did not do the COM solution, it got me thinking that I could stay with .NET and led to this solution. Good job all!

EDIT:

I created a blog post to detail the steps and provide additional information:

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

Generalist answered 21/9, 2009 at 5:29 Comment(2)
That's certainly better than going via COM. :-)Roath
I guess DotNetFactory.CreateInstance() is unique to QTP?Thomasthomasa
B
1

As Marc said, but I think it merits an answer. If you ensure that your dll will be available though the COM mechanics, your script should be able to call into it with things like CreateObject.

How to register .NET assembly for COM interop

Butler answered 20/9, 2009 at 21:4 Comment(1)
I made the assembly COM-Visible. In QTP/vbs I have added: Dim example Set example = CreateObject("st.Class1") But I get an error: ActiveX component can't create object: 'st.Class1'Generalist
R
1

Your function is static. Static class members can't be matched up to interface members, and if it can't implement a .NET interface then it certainly won't implement a COM interface.

Roath answered 20/9, 2009 at 21:28 Comment(1)
I have removed the static keyword. Same problem. Are there any tutorials on getting a simple class to work in this way without QTP? I am looking for the simplest example possible to then understand what I need to do.Generalist

© 2022 - 2024 — McMap. All rights reserved.