Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用shell命令从VBA向regasm注册DLL_.net_Excel_Vba_Dll_Regasm - Fatal编程技术网

.net 使用shell命令从VBA向regasm注册DLL

.net 使用shell命令从VBA向regasm注册DLL,.net,excel,vba,dll,regasm,.net,Excel,Vba,Dll,Regasm,好的,我正在尝试将我的电子表格使用的DLL与excel文件打包。我的电子表格将被复制到不同的PC上,并从不同的地方使用。我试图避免每次将工作表(带有DLL)复制到新PC上时,都让用户运行regasm。我已求助于执行shell命令,在启动时向regasm注册DLL。这是我的密码: Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim strWinCmd As String Dim retVal As Double s

好的,我正在尝试将我的电子表格使用的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,然后在关闭时取消注册。我的问题是,当我在新电脑上打开电子表格时,Button_Handlers.Initialize中出现错误。它告诉我,我试图使用一个未定义的类(JART.MainJobControl),就好像DLL没有被引用一样。如果我尝试重新打开文件,一切正常


我这样做的方式是在已经向regasm注册的机器上手动添加对DLL的引用。然后我保存这个excel文件,并将其传输到一台尚未注册DLL的机器上,然后尝试打开它并运行它。我认为,由于引用已经添加到excel文件中,代码所要做的就是向regasm注册它。有人知道为什么这样不行吗?我是不是睡得不够长。

我只是解决了我在问题中提到的怪癖。我不得不将initialize移到另一个方法中,这样它就不会在与regasm相同的操作中被调用。这似乎很有效。我还没有遇到任何问题。

这就是无法工作,Regasm.exe需要运行提升版,以便可以写入HKLM注册表项。没有什么可以替代运行一次。如果dll被其他程序使用,会发生什么情况为什么不将电子表格打包到安装程序中呢?其他程序不使用此DLL。在这种情况下,我只是在excel文件旁边打包一个DLL。事实上,我是以某种方式让它起作用的,但我忘了我必须做些什么才能让它为我起作用。