所以..我们有一个用于USB /串行设备的C#实用程序。我想在安装过程中安装驱动程序。我知道有很多关于这个的帖子,我已经阅读了很多msdn和stackoverflow文章,但我似乎没有成功。
驱动程序没问题,它是一个股票Arduino驱动程序,所以它已签名,可以从windows gui安装(右键单击inf,安装) 我为applcation创建了一个visual studio安装项目,并为自定义安装操作创建了一个VB项目。安装程序将驱动程序复制到安装文件夹。驱动程序安装是从“OnCommitted”方法执行的。在这里,我通过调用cmd.exe生成一个进程,并希望调用一些命令来安装驱动程序。
首先我尝试了“RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 132”,但它总是失败,尽管我获得了管理权限。 我试图在不同的地方获得管理员权限: - 我尝试添加条件为“AdminUser”的“启动条件” - 我试图从VB运行cmd作为管理员(Process.Startinfo.Verb =“runas”) 以上都没有解决我的问题。 然后我尝试了其他方法安装驱动程序和InfDefaultInstall.exe几乎没问题,但有时它在某些机器上失败,我不知道为什么。 pnputil.exe总是对我失败。 我想这样做的官方方法是调用InstallHinfSection,因为MSDN建议,我宁愿使用它。我们必须支持Windows 7及更高版本。
对我做错了什么想法? 提前谢谢!
这是我的VB方法:
Private Sub InstallDriverPNPUtil()
Dim infPath As String = """" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\arduino.inf" + """"
Dim processInfo As New ProcessStartInfo("CMD", "/C pnputil -i -a " + infPath)
processInfo.WindowStyle = ProcessWindowStyle.Hidden
Dim p As System.Diagnostics.Process = Process.Start(processInfo)
p.WaitForExit()
End Sub
Private Sub InstallDriverInfDefaultInstall()
Dim infPath As String = """" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\arduino.inf" + """"
Dim processInfo As New ProcessStartInfo("CMD", "/C InfDefaultInstall.exe " + infPath)
processInfo.WindowStyle = ProcessWindowStyle.Hidden
Dim p As System.Diagnostics.Process = Process.Start(processInfo)
p.WaitForExit()
End Sub
Private Sub InstallDriverInstallHinfSection()
Dim infPath As String = """" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\arduino.inf" + """"
Dim process As New Process()
process.StartInfo.FileName = "cmd.exe"
'fails with and without this
process.StartInfo.UseShellExecute = True
process.StartInfo.Verb = "runas"
process.StartInfo.Arguments = "/C RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 " + infPath
'MsgBox(process.StartInfo.Arguments, MsgBoxStyle.OkOnly, "InstallHinfSection")
process.Start()
process.WaitForExit()
End Sub