8

我以为我知道如何做到这一点,但显然不是,所以我会很感激一些帮助!我无法让我的 dll 注册,因此我可以在 VBS 或其他地方实例化它。

我编写了以下示例类,选中“使程序集 COM 可见”,选中“注册 COM 互操作”,然后构建它。当我尝试从 VBS 实例化它时,我收到“Activex 组件无法创建对象”错误。

这是类代码:

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

namespace Smurf
{
    public class Pants
    {
        public string Explode(bool Loud)
        {
            string result;
            if (Loud)
                result = "BANG";
            else
                result = "pop";
            return result;
        }
    }
}

...这是 VBS:

Dim a

Set a = CreateObject("Smurf.Pants")

msgbox("ok")

我还需要做什么?

谢谢 :)

[编辑]

忘了提,在第一次失败后,我尝试了 REGSVR32 和 REGASM - 没有帮助!

[/编辑]

请注意,当我尝试 REGSVR32 时,会收到以下消息:

模块“C:...\Smurf.dll”已加载,但未找到入口点 DllRegisterServer。确保“C:...\Smurf.dll”是有效的 DLL 或 OCX 文件,然后重试。

这有多大帮助??

这是最新版本的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Smurf
{
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    public interface IPants
    {
        [DispId(1)]
        string Explode(bool Loud);
    }

    [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
        InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IPantsEvents
    {
        string Explode(bool Loud);
    }

    [ComVisible(true)]
    [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
        ClassInterface(ClassInterfaceType.None),
        ComSourceInterfaces(typeof(IPantsEvents))]
    public class Pants : IPants
    {
        public Pants() { }

        [ComVisible(true)]
        [ComRegisterFunction()]
        public static void DllRegisterServer(string key) { }
        [ComVisible(true)]
        [ComUnregisterFunction()]
        public static void DllUnregisterServer(string key) { }

        [ComVisible(true)]
        public string Explode(bool Loud)
        {
            string result;
            if (Loud)
                result = "BANG";
            else
                result = "pop";
            return result;
        }
    }
}
4

1 回答 1

10

这里可能有一些不同的事情在起作用。首先,您需要在提升的命令提示符下使用 regasm 工具和 /codebase /tlb 开关(假设是 Windows Vista、7 或 Windows Server 2008)。就像是:

regasm "Path to Smurf.dll" /codebase /tlb

使用 regasm 注册 dll 后,您应该能够使用 VBS、VBA 或 VB6 调用它。

我能够使用 VBA 中的早期绑定和后期绑定来调用该Explode方法。但是,当我尝试使用 VBScript 时,我收到“ActiveX 无法像您一样创建对象错误”。

我在 Windows 7 64 位上运行,我记得在编译为 32 位 dll 并在 64 位操作系统上运行它们时,这可能会导致问题。一时兴起,我启动了命令提示符并输入:

C:\Windows\SysWow64\CScript.exe "Path to VBScript"

结果是脚本正确运行并在屏幕上显示“Pop”。

这是我使用的稍微简化的 C# 代码以及 VBScript 文件的内容。

namespace Smurf
{
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    public interface IPants
    {
        string Explode(bool Loud);
    }

    [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
     InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IPantsEvents
    {
        string Explode(bool Loud);
    }

    [ComVisible(true)]
    [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(IPantsEvents))]
    public class Pants : IPants
    {

        [ComVisible(true)]
        public string Explode(bool Loud)
        {
            string result;
            if (Loud)
                result = "BANG";
            else
                result = "pop";
            return result;
        }
    }
}

VB脚本:

Dim x 
Set x = CreateObject("Smurf.Pants")
MsgBox (x.Explode(False))
Set x = Nothing
于 2012-07-25T18:10:35.590 回答