在过去的 2 天里,我一直在尝试获得一个在 VBA 中创建的基本 VB.NET dll。我已经阅读了关于这个视线的每一篇文章,但我总是遇到同样的错误。
- 我创建了一个 VB.NET 类(我以管理员身份运行 Visual Studio)。
我的类(class)
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.Interposervices
Imports System.Linq
Public Class TestClass
Function TestMethod(ByVal input as String)
Return "Hello" & input
End Function
End Class
- 我设置“使程序集可见”
- 我设置了“注册 COM 互操作”
我构建并发布 dll
我打开 Excel 并添加对 dll 的引用。
目前一切正常
在工作表中添加以下代码
Public Sub test() Dim a As TestClass 'Note: Auto fills in once i start typing it in so i know that the DLL there Set a = New TestClass MsgBox (a.TestMethod("World") End Sub
当我尝试运行代码时出现以下错误
"ActiveX component can't create object"
我已经使用 2 台计算机尝试过此操作:Win7 64 位、Excel 2010 64 位、VS 2010 和 Win7 64 位、Excel 2013、VS 2010 64 位,运气不错。我读过有人收到同样的错误,但我似乎没有任何效果。
有人看到我的方法有什么错误吗?
最佳答案
-为您的代码添加命名空间。
- 将函数设置为public
。
- 使其 com 可见并按照您提到的那样设置“注册 COM 互操作”。
- 你的代码应该是这样的:
Namespace X
Public Class TestClass
Public Function TestMethod(ByVal input As String)
Return "Hello" & input
End Function
End Class
End Namespace
-构建您的项目,您将在\bin\debug 或\bin\release 中找到一个yourProjName.tlb 文件。
- 打开 Excel 并添加对 yourProjName.tlb 的引用而不是 dll。
- 将您的代码修改为:
Sub test()
Dim testObj As New TestClass
Dim myStr As String
myStr = testObj.TestMethod("ssssss")
MsgBox myStr
End Sub
这对我有用。
编辑 #1
-我正在使用 Windows 7 32 位、带有 SP2 的 Office 2010 专业版 32 位、带有框架 4 的 Visual Studio 2010。
-为 x64 配置项目:从 Visual Studio -> 转到构建菜单 -> 单击配置管理器 -> 在事件解决方案平台下,单击新建,然后添加一个 x64 作为平台。使用此平台为 x64 编译,link .
-最好对程序集进行签名(非常简单):项目属性>签名>对程序集进行签名>新建->输入文件名myKey.snk,不需要密码。
-构建你的项目。
- 如果您在运行 visual studio 的同一台机器上工作,则无需注册您的程序集,因为 VS 会注册,因为我们设置了“注册 COM 互操作”。
-对于没有运行VS的其他客户端机器,你必须注册你的程序集,只拿DLL文件,以管理员身份运行cmd,运行以下命令:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm /codebase /tlb "D:\out\VB_DLL_001.dll"
请注意,此命令会在同一文件夹中为您生成 *.tlb 文件。
- 通过在 cmd 中运行以下命令(以管理员身份运行)将您的 dll 添加到全局程序集缓存:
"c:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\gacutil.exe" /i "d:\out\VB_DLL_001.dll"
-从 Excel 添加对生成的 tlb 文件的引用:VBA 编辑器 -> 工具 -> 引用 -> 浏览 -> 选择 tlb 文件 -> 确定。然后运行前面的代码,希望能运行成功。
编辑 #2
根据评论,它通过为 x64 架构构建 DLL 来工作,因此,不需要编辑 #1 中的其他步骤。
关于excel - VBA (Excel) 中的 .NET DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27587765/