.net 使用shell命令从VBA向regasm注册DLL
好的,我正在尝试将我的电子表格使用的DLL与excel文件打包。我的电子表格将被复制到不同的PC上,并从不同的地方使用。我试图避免每次将工作表(带有DLL)复制到新PC上时,都让用户运行regasm。我已求助于执行shell命令,在启动时向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
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。事实上,我是以某种方式让它起作用的,但我忘了我必须做些什么才能让它为我起作用。