无法在VBA中使用我简单的VB类库

时间:2018-07-18 11:03:21

标签: vba vb.net com com-interop com-interface

这是我在这个很棒的社区中的第一篇文章,我是一个绝对的初学者,我敢肯定我会从这里得到好的建议。

我在Visual Studio 2017中生气了这个简单的VB类库

// read counter value
root@rp-f0184d:~# monitor 0x42000008
0x00000000

// start counting pulses (by default stopped)
root@rp-f0184d:~# monitor 0x42000000 1

// read counter values
root@rp-f0184d:~# monitor 0x42000008
0x00000db5
root@rp-f0184d:~# monitor 0x42000008
0x00001404
root@rp-f0184d:~# monitor 0x42000008
0x000017ca
root@rp-f0184d:~# monitor 0x42000008
0x00001b86
root@rp-f0184d:~# monitor 0x42000008

我将其设为COM可见并选中了注册COM互操作。并构建项目。

在我的Access VBA项目中,我毫无问题地将引用添加到了Dll,并将以下代码放在按钮的click事件后面。

Public Class Addition
    Public Function Add(No1 As Long, No2 As Long) As Long
        Return No1 + No2
    End Function
End Class

“ ShwDolphin”是VB程序集名称。

但我总是收到此错误消息 “运行时错误429 Active X组件无法创建对象”

您能告诉我我在做什么错吗? 这让我发疯。

非常感谢您。

3 个答案:

答案 0 :(得分:2)

阅读评论,我猜想您在我所说的“位”上有区别。 Visual Studio中的默认项目通常为32位。如果构建32位COM DLL,则只能由32位进程加载。如果您的Office安装是64位的,它将永远无法运行。您需要做的是为64位构建/注册它。

现在,如果您是为MSIL而不是任何特定处理器(x86或x64)构建的,则不必真正为64位重建。所需要做的就是注册64位。 (默认的构建配置是MSIL。)

因此,您需要在C:\ windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ regasm.exe中使用64位重排

使用/ tlb / codebase“ thenameofyour.dll”选项重新使用

如果您构建的是x64,而Office是32位的,则请执行相反的操作:使用32位重排,但是您使用的默认值是32位。

您也可以查看以下答案:activex can't create object by vbs but can by classic asp

答案 1 :(得分:1)

因此,经过很多挫折之后,我可以通过执行以下操作使其工作:

1-用相同的代码创建一个新项目(比删除以前的dll容易。)

2-在Visual Studio的项目属性中禁用“注册COM互操作”选项。

3-构建项目。

4-使用C:\ windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ regasm.exe中的64位重载来注册我的程序集。

5-在VBA编辑器中添加对生成的tlb文件的引用。

感谢大家的慷慨帮助,感谢这个社区。 我不知道为什么必须这样做,但是我使用的是64位Windows和64位Office。 就像@dee所说的那样,添加接口不是必需的,它可以正常工作。

答案 2 :(得分:0)

要能够在VBA中使用自定义.NET类,*。dll必须向COM自动化公开方法(和属性)。这对您意味着什么?您必须创建一个界面。

Public Interface IAddition
    Function Add(No1 As Long, No2 As Long) As Long
End Interface

Public Class Addition
    Implements IAddition
    Public Function Add(No1 As Long, No2 As Long) As Long Implements IAddition.Add
        Return No1 + No2
    End Function
End Class

用法:

Private Sub Command0_Click()
Dim myCalc As ShwDolphin.IAddition
Set myCalc = New ShwDolphin.Addition
Dim Num As Long
Num = myCalc.Add(2, 5)
Debug.Print Num
End Sub

有关更多详细信息,请按照我过去的回答中提供的说明进行操作:Generics and Com Visible .NET libraries

您可能也对本文感兴趣:Extend your VBA code with C#, VB.NET, or C++/CLI

祝你好运!