VBScript - 使用未注册的DLL

时间:2017-10-23 19:58:17

标签: dll vbscript

我最近一直在寻找一种在VBScript中使用未注册的DLL的方法。 This接受的答案说可以使用GetObject完成,前提是(在给出答案的人的评论中提到)DLL暴露了COM接口。我以前从未在C#中编码,但我想尝试一下,因为答案是针对那种语言的。经过一些搜索,我在this网站上找到了以下代码示例:

using System;
using System.Runtime.InteropServices;

namespace Tester
{
    [Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface _Numbers
    {
        [DispId(1)]
        int GetDay();

        [DispId(2)]
        int GetMonth();

        [DispId(3)]
        int GetYear();

        [DispId(4)]
        int DayOfYear();
    }

    [Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("Tester.Numbers")]
    public class Numbers : _Numbers
    {
        public Numbers() { }

        public int GetDay()
        {
            return (DateTime.Today.Day);
        }

        public int GetMonth()
        {
            return (DateTime.Today.Month);
        }

        public int GetYear()
        {
            return (DateTime.Today.Year);
        }

        public int DayOfYear()
        {
            return (DateTime.Now.DayOfYear);
        }
    }
}

使用Visual Studio 2010 Professional,我创建了一个新的C#类库并将其命名为Tester。我将上面的代码复制到默认的Class1.cs文件中并进行编译。然后,我使用以下代码创建了一个.vbs文件:

Option Explicit

Dim Obj

' This part gives the following error message:
'   ActiveX component can't create object: 'GetObject'
Set Obj = GetObject("C:\MyFolderPath\Tester.dll", "Tester.Numbers")
MsgBox Obj.GetDay

但是,代码引发了错误,并且不会实例化该对象。我尝试在32位和64位版本的wscript.exe上运行.vbs文件,因为我在Windows 7 64位上。但是,两次错误都是一样的。那么,我需要在C#代码和/或我需要在Visual Studio中更改的其他选项中更改某些内容,或者链接答案中的人声称是否错误?

编辑1

我的问题不是this的问题。我意识到有类似性质的请求。但是,我的问题与举证责任有关。 Nilpo声明GetObject将允许VBScript使用未注册的C#DLL实例化一个对象,只要它暴露一个COM接口,甚至在同一个问题中为自己的位置辩护。我尽我所能利用他描述的方法并且没有成功。所以,如果有可能,我希望看到一个简单的工作示例。而且,如果没有,我希望看到一些文件显示为什么不。

此外,如果这真的是允许我正在寻求的功能的唯一方法,我将很乐意使用另一种编程语言。因此,我从我的问题标题中删除了C#并取出了C#标签。

编辑2

我修复了我发布的原始C#代码的语法高亮显示。我在第一次编辑中从问题中删除了C#标签后,它就崩溃了。

1 个答案:

答案 0 :(得分:0)

您处于正确的轨道,但CodeProject链接要求您使用COM注册库,这需要提升权限。

但是,如果您将ComVisible attribute添加到要公开的类中,则在编译DLL后,您应该可以通过GetObject()调用它。

[Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Tester.Numbers")]
[ComVisible(true)]
public class Numbers : _Numbers
{
    public Numbers() { }

    public int GetDay()
    {
        return (DateTime.Today.Day);
    }

    public int GetMonth()
    {
        return (DateTime.Today.Month);
    }

    public int GetYear()
    {
        return (DateTime.Today.Year);
    }

    public int DayOfYear()
    {
        return (DateTime.Now.DayOfYear);
    }
}