不能使用AddFromFile添加DLL引用

我正在尝试从Excel VBA使用COM可见的.NET DLL。 使用regasm注册DLL时,我已经成功,然后通过VBA Developer窗口中的Tools – > References菜单项手动添加对它的引用。

但是,我现在正在尝试注册DLL而不使用regasm命令,以便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_Instancevariables说没有设置引用时,我得到一个错误。 即使PostInitialize在Initialize之后被直接调用,也没有任何证据表明任何代码抛出错误或运行失败。 如果我尝试在PostInitialize函数中放置“Stop”命令,它会告诉我“此时不能进入break模式”。

任何想法,谢谢。

Excel-DNA有一个帮助function,可以在该平台上编写Com Addins。

它似乎:

  1. 加载插件
  2. 用CoRegisterClassObject注册它
  3. 将它添加到registry中
  4. 将其添加到registry项HKCU \ Software \ Microsoft \ Office \ Excel \ Addins
  5. 在Excel中调用Application.ComAddins.Update
  6. 删除所有以前的registry项
  7. 用CoRevokeClassObject取消注册对象

这似乎是一旦Excel已经加载插件,它不会卸载registry项被删除,并调用CoRevokeClassObject。 它保持加载,直到Excelclosures并释放它。

所以,这是可行的,但并不容易。

好吧,所以我已经采取了一个shell命令来注册DLL regasm。 这是我的代码:

 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,并取消注册closures。 我的问题是,当我在一台新的PC上打开这个文件时,我在Button_Handlers.Initialize中出现错误。 它告诉我,我试图使用一个未定义的类(JART.MainJobControl),就像该DLL没有被引用。 如果我试图重新打开文件一切工作正常?

我这样做的方法是手动添加引用到一个已经注册了regasm的机器上的DLL。 然后我保存这个excel文件,并将其传输到一个没有注册DLL的机器上,并尝试打开它并运行它。 我认为,因为引用已经添加到Excel文件,所有代码必须做的是注册与regasm。 有谁知道为什么这不起作用? 我睡不够久。 我可以把这个作为一个单独的问题发布。