0

好的,所以我正在尝试将我的电子表格使用的 DLL 与 excel 文件打包在一起。我的电子表格将被复制到不同的 PC 并从不同的地方使用,我试图避免每次将工作表(带有 DLL)复制到新 PC 时让用户运行 regasm。我已经使用了一个 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 """ & Application.ActiveWorkbook.Path & "\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 注册它。有谁知道为什么这不起作用?我是不是睡得不够久。

4

1 回答 1

0

好吧,我最终解决了我在问题中提到的怪癖。我不得不将初始化移动到不同的方法中,这样它就不会在与 regasm 相同的操作中被调用。这似乎运作良好。我还没有遇到任何麻烦。

于 2013-12-13T21:30:18.943 回答