1

所以.. 我们有一个用于 USB/串行设备的 C# 实用程序应用程序。我想在设置过程中安装驱动程序。我知道有很多关于此的帖子,并且我浏览了许多 msdn 和 stackoverflow 文章,但我似乎没有成功。

驱动程序没问题,它是一个库存的 Arduino 驱动程序,所以它已签名并且可以从 windows gui 安装(右键单击 inf,安装)我为我们的应用程序创建了一个 Visual Studio 安装项目,并为自定义创建了一个 VB 项目设置动作。安装程序将驱动程序复制到安装文件夹。驱动程序安装是从“OnCommitted”方法执行的。在这里,我通过调用 cmd.exe 生成一个进程,并想调用一些命令来安装驱动程序。

首先我尝试了“RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 132”,但它总是失败,尽管我为此获得了管理员权限。我试图在不同的地方获得管理员权限: - 我试图添加一个带有条件“AdminUser”的“启动条件” - 我试图从VB(Process.Startinfo.Verb =“runas”)以管理员身份运行cmd以上解决了我的问题。然后我尝试了其他方法来安装驱动程序,InfDefaultInstall.exe 几乎没问题,但有时在某些机器上会失败,我不知道为什么。pnputil.exe 对我来说总是失败。我想这样做的官方方法是按照 MSDN 的建议调用 InstallHinfSection,我更愿意使用它。我们必须支持 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
4

0 回答 0