我正在尝试使用Excel VBA中的COM可见.NET DLL。我在使用regasm注册DLL然后通过Tools - >手动添加引用时成功了。 VBA开发人员窗口中的引用菜单项。
但是,我现在尝试在不使用regasm命令的情况下注册DLL,以便可以在任何计算机上使用Excel文件而无需注册DLL。到目前为止,这是我尝试过的:
Dim JART_Instance As Object
Sub Initialize()
Dim RefPath As String, X As Byte
Const RefName = "JART xxx"
RefPath = Application.ActiveWorkbook.Path & "\JART\JART.dll"
With ActiveWorkbook.VBProject.References
For X = 1 To .Count
If .Item(X).Description Like RefName Then
.Remove .Item(X)
End If
Next
.AddFromFile (RefPath)
End With
End Sub
Sub PostInitialize()
Set JART_Instance = New JART.MainJobControl
End Sub
我添加了对“Microsoft Visual Basic for Applications Extensibility 5.3”的引用。当我运行上面的代码时,我得到“运行时错误'48':加载DLL时出错”。我用regasm加载了这个DLL几次。我是否需要执行更改项目中使用的GUID并重试的操作。我已经看到了代码示例,它应该可以工作。
如果我引用tlb文件而不是.dll我没有得到DLL加载错误。相反,每当我尝试使用JART_Instance变量表示尚未设置引用时,我都会收到错误。即使在Initialize之后直接调用PostInitialize并且没有证据表明任何代码引发了错误或无法运行。如果我尝试在PostInitialize函数中放置一个“停止”命令,它会告诉我“此时无法进入中断模式”。
任何想法,谢谢。
答案 0 :(得分:1)
Excel-DNA有一个辅助函数,可以为在该平台上编写的Com Addins执行此操作。
似乎:
一旦Excel加载了插件,它就会在删除注册表项并调用CoRevokeClassObject时不会卸载。它会保持加载状态,直到Excel关闭并释放它。
所以,这是可行的但不容易。
答案 1 :(得分:0)
好的,所以我使用shell命令用regasm注册DLL。这是我的代码:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim strWinCmd As String
Dim retVal As Double
strWinCmd = "cmd.exe %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\regasm.exe /u /codebase /tlb .\JART\JART.dll"
retVal = Shell(strWinCmd, vbHide)
End Sub
Private Sub Workbook_Open()
Dim strWinCmd As String
Dim retVal As Double
strWinCmd = "cmd.exe /c %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\regasm.exe /codebase /tlb """ & Application.ActiveWorkbook.Path & "\JART\JART.dll"""
Call Shell(strWinCmd, vbNormalFocus)
Call Button_Handlers.Sleep(1500)
Call Button_Handlers.Initialize
End Sub
作为参考,Button_Handlers.Sleep只调用系统睡眠方法,Button_Handlers.Initialize执行此操作:
Sub Initialize()
'This JART.MainJobControl is the main class in the JART DLL
Set JART_Instance = New JART.MainJobControl
'Use JART_Instance
End Sub
所以基本上我试图在启动时注册DLL并在关闭时取消注册。我的问题是,当我在新PC上打开此文件时,我在Button_Handlers.Initialize中出错。它告诉我,我正在尝试使用未定义的类(JART.MainJobControl),就像没有引用DLL一样。如果我尝试重新打开文件,一切正常???
我这样做的方法是在已经用regasm注册的机器上手动添加对DLL的引用。然后我保存这个excel文件并将其传输到没有注册DLL的机器,并尝试打开它并运行它。我认为,由于引用已经添加到excel文件中,所以代码所要做的就是用regasm注册它。有谁知道为什么这不起作用?我睡得不够久。我可以将此作为一个单独的问题发布。