vba运行时错误'429':ActiveX不能创建对象,用户定义vb.net dll(VB.NET 2017,Excel 2016)
我已经写了一个简单的DLL在VB.NET 2017中,我是试图从VBA调用它(Excel 2016)。我已经通过堆栈溢出和MSDN进行了搜索,但尽管此VBA错误点击很多,我无法找到与用户定义的dll相关的信息来解决此特定问题。vba运行时错误'429':ActiveX不能创建对象,用户定义vb.net dll(VB.NET 2017,Excel 2016)
我在编译dll时勾选了注册COM Interop选项。我也验证了使装配COM-Visible框也被检查。
编译成功,我能够在VBA编辑器内的References中找到我的库(名为TestLibrary2)。我在其中创建的班级名为TestVBNET。我检查TestLibrary2将其包括在VBA,然后再尝试运行VBA下面的代码:
Public Sub mySub() Dim myTest2 As TestLibrary2.TestVBNet
Set myTest2 = New TestLibrary2.TestVBNet
End Sub
当我跑分,我得到的消息弹出对话框:运行时错误“429”:基于什么我已经阅读MSDN和其他网站
的ActiveX不能创建对象,预期的结果是TestLibrary2.TestVBNet对象应成功实例。
下面的代码是我编译到dll的VB.NET代码。 GUID是在Windows 10命令提示符下使用guidgen生成的。
Imports System.Runtime.InteropServices <Guid("2CEBF80D-D5FC-4C52-BCF1-E2F076318240")>
Public Interface ITestVBNet
Function addTrig(x As Double, y As Double) As Double
End Interface
<Guid("60983277-A724-4CDD-8ACE-B94CF9546F43")>
<ClassInterface(ClassInterfaceType.None)>
Public Class TestVBNet
Function addTrig(x As Double, y As Double) As Double
Return Math.Sin(x) + Math.Cos(x)
End Function
End Class
任何帮助和或引用将不胜感激。提前致谢。
编辑(每条评论如下):我编译了dll作为管理员,这实际上是需要为注册COM Interop选项才能运行的。还为管理员 - - 我使用regasm也试过如下,在同一个目录中编译的.dll文件:
regasm /codebase /tlb TestLibrary2.dll
下返回:
RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can cause your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a span name and re-register it. Types registered successfully
RegAsm : error RA0000 : An error occurred while saving the exported type library: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
我能在这里对于新手道歉关于注册COM库,但这似乎表明该DLL已成功注册,但无法转移到GAC。我的意图是不转让它。当我尝试在VBA中加载它时,发生了与上面相同的错误。
回答:
事实证明,上面的代码编译为一个dll,确实可以从C#客户端调用。然而,VBA的问题是我忽略了在派生类声明之后放置了Implements ITestVBNet。但在VB.NET中,除此之外,还必须在派生函数声明中明确指示函数重写;即(滚动一路看到整个线的右边),
Public Function addTrig(x As Double, y As Double) As Double Implements ITestVBNet.addTrig
通过用以下代替上述派生类,我能够创建在VBA中TestVBNet对象的一个实例,并调用addTrig (。)方法成功:
<Guid("60983277-A724-4CDD-8ACE-B94CF9546F43")> <ClassInterface(ClassInterfaceType.None)>
Public Class TestVBNet
Implements ITestVBNet
Public Function addTrig(x As Double, y As Double) As Double Implements ITestVBNet.addTrig
Return Math.Sin(x) + Math.Cos(x)
End Function
End Class
以上是 vba运行时错误'429':ActiveX不能创建对象,用户定义vb.net dll(VB.NET 2017,Excel 2016) 的全部内容, 来源链接: utcz.com/qa/259979.html