【问题标题】:A Simple C# DLL - how do I call it from Excel, Access, VBA, VB6?一个简单的 C# DLL - 如何从 Excel、Access、VBA、VB6 调用它?
【发布时间】:2009-07-23 10:08:12
【问题描述】:

我有一个用 c# 编写的简单类库。

using System;
namespace TestDll
{
    public class Test
    {
        public string HelloWorld
        {
            get
            {
                return "Hello World";
            }
        }
    }
}

我的问题是如何从 Microsoft Office Visual Basic(我认为是 VB6)调用这个 HelloWorld 函数?

我的第一步是将 DLL 添加为引用 - 但在浏览和选择已编译的 DLL 时出现“无法添加对指定文件的引用”的消息。被扔了。

谁能指出我为什么/如何让它工作的正确方向?

提前致谢!

【问题讨论】:

标签: c# excel dll vb6 interop


【解决方案1】:

您不能通过 COM 互操作访问静态成员。实际上,您的代码甚至都没有编译,该方法应该在一个类中。以下是你可以做到的:

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("01A31113-9353-44cc-A1F4-C6F1210E4B30")]  //Allocate your own GUID
public interface _Test
{
    string HelloWorld { get; }
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("E2F07CD4-CE73-4102-B35D-119362624C47")]  //Allocate your own GUID
[ProgId("TestDll.Test")]
public class Test : _Test
{
    public string HelloWorld { get { return "Hello, World! "; } }
}

在项目属性Build选项卡中,选择Register for COM interop。所以你可以很快看到结果。要在另一台机器上安装 dll,您需要使用 regasm。

然后消费这个:

Dim o : Set o = CreateObject("TestDll.Test")
MsgBox o.HelloWorld

您还可以引用 dll 并使用早期绑定:

Dim o As TestDll.Test
Set o = New TestDll.Text
MsgBox o.HelloWorld

【讨论】:

  • 感谢 AnthonyWJones,一个非常好的答案 - 自发布此答案以来我一直在搜索 - 除了我必须声明一个接口之外,我发现了所有内容!非常感谢!!
  • 可以在不声明接口的情况下完成,但我不建议这样做,使用专门供 COM 客户端使用的接口是一种更好的方法。
  • 谢谢安东尼,你介意批评我发布的后续答案吗?
  • 如果您在尝试在 VBA 中创建类的实例时遇到“ActiveX 组件无法创建对象”(运行时错误 429),您可能需要运行 regasm.exe /codebase TestDll.dll ,甚至在您自己的机器上。
【解决方案2】:

并扩展在不同计算机上注册 DLL。

一旦你在你的开发机器上编译和构建了上面的代码,如果你有

项目属性Build选项卡,选择Register for COM interop。

找到已编译 *.dll 的 Visual Studio 输出文件夹(通常是 bin\Debug)也将包含一个 *.tlb 文件。

这个 *.tlb 文件是一个“类型库”。并且客户端机器需要了解 *.dll 中的不同“类型”并基本上告诉客户端机器如何使用它。

通过设置上述“注册 COM 互操作”——以及生成的 *.tlb 文件,程序集 (dll) 已在您的计算机上注册,因此可以访问。

在 VBA 中,您现在可以将此文件添加为参考

VBA 编辑器 -> 工具 -> 参考 -> 浏览 -> 选择

这将允许您随后声明在您的库中找到的类。

Dim TestClass As Test
Set TestClass = New Test
MsgBox TestClass.HelloWorld

但是 - 如果您想在不同的客户端机器上使用您的 dll,则必须使用 regasm.exe - 在该机器上注册程序集(dll)。

这可以通过命令行来完成,

regasm.exe

在这种情况下

regasm.exe TestDll.dll

在新客户端计算机上注册程序集后,您将能够通过再次添加对其 *.tlb 的引用来访问它

希望这会有所帮助!

【讨论】:

  • 你是在开发者机器还是客户端机器上运行 regasm?因为我的客户端机器没有安装.NET。
  • Alexey .Net DLL 需要 .Net 框架才能在客户端计算机上运行。
【解决方案3】:

只是想评论一下,在 Visual Studio 2008 中,要生成 .tlb 文件,您还必须进入 Application |装配信息并选择“使装配 COM 可见”。我花了一段时间才找到它,所以希望它可以帮助其他人。

【讨论】:

  • +1 谢谢,谢谢,谢谢!之前非常间歇地工作,然后停止,现在在这样做之后工作,天知道接下来会发生什么,但至少它现在正在工作。在这里使用 VS2010,所以仍然相关。
【解决方案4】:

要添加到 AnthonyWJones 的好答案,您还需要使用 Regasm.exe 注册您的 DLL,这会添加必要的注册表项。

【讨论】:

  • 抱歉,没有注意到 AnthonyWJones 已经提到了 Regasm。
猜你喜欢
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多