我有一个用c#编写的简单类库。
using System;
namespace TestDll
{
public class Test
{
public string HelloWorld
{
get
{
return "Hello World";
}
}
}
}
我的问题是如何从Microsoft Office Visual Basic(我认为是VB6)调用此HelloWorld函数?
我的第一步是添加DLL作为参考 - 但在浏览和选择已编译的DLL时,消息“无法添加对指定文件的引用”。被扔了。
有人能指出我为什么/如何让这个工作正确的方向?
提前致谢SO!
答案 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,这会添加必要的注册表项。