一个简单的C#DLL - 如何从Excel,Access,VBA,VB6中调用它?

时间:2009-07-23 10:08:12

标签: c# excel dll vb6 interop

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

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

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

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

有人能指出我为什么/如何让这个工作正确的方向?

提前致谢SO!

4 个答案:

答案 0 :(得分:53)

您无法通过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

答案 1 :(得分:22)

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

在开发机器上编译和构建上述代码后,如果有

  

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

您的Visual Studio输出文件夹(通常是bin \ Debug),其中找到已编译的* .dll也将具有* .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的引用来访问它。

希望这有帮助!

答案 2 :(得分:10)

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

答案 3 :(得分:1)

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