使用Wix 3.10.2生成我的产品安装程序。我在卸载驱动程序时遇到了很多麻烦。我一直在关注网络上的示例,因为我可以理解它们,我可以安装驱动程序。问题在于卸载 - 他们不会。
以下是product.wxs的相关部分:
<Directory Id="MYDRIVER" Name="myDriver">
<!-- Windows 7 -->
<Component Id="myDriver_Win7" Guid="..." KeyPath="yes" SharedDllRefCount="yes" Win64="$(var.Win64)">
<Condition>VersionNT = 601</Condition>
<File Id="myDriver.inf_win7" Name="myDriver.inf" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win7Release\myDriver.inf" />
<File Id="myDriver.sys_win7" Name="myDriver.sys" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win7Release\myDriver.sys" />
<File Id="myDriver_.cat_win7" Name="myDriver_.cat" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win7Release\myDriver_.cat" />
<Driver AddRemovePrograms="no" DeleteFiles="yes" Legacy="yes" PlugAndPlayPrompt="no" Sequence="4" xmlns="http://schemas.microsoft.com/wix/DifxAppExtension" />
</Component>
<!-- Windows 8.1, Server 2012R2 -->
<Component Id="myDriver_Win8.1" Guid="..." KeyPath="yes" SharedDllRefCount="yes" Win64="$(var.Win64)">
<Condition>VersionNT = 603</Condition>
<File Id="myDriver.inf_win8.1" Name="myDriver.inf" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win8.1Release\myDriver.inf" />
<File Id="myDriver.sys_win8.1" Name="myDriver.sys" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win8.1Release\myDriver.sys" />
<File Id="myDriver_.cat_win8.1" Name="myDriver_.cat" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win8.1Release\myDriver_.cat" />
<Driver AddRemovePrograms="no" DeleteFiles="yes" Legacy="yes" PlugAndPlayPrompt="no" Sequence="4" xmlns="http://schemas.microsoft.com/wix/DifxAppExtension" />
</Component>
</Directory>
<Feature Id="extDevice" AllowAdvertise="no" ConfigurableDirectory="INSTALLDIR" Level="101" Title="External USB Device">
...
<ComponentRef Id="myDriver_Win7" />
<ComponentRef Id="myDriver_Win8.1" />
...
</Feature>
根据操作系统版本安装相应的驱动程序。卸载,我原以为,只是反过来。
我从阅读https://msdn.microsoft.com/en-us/library/windows/hardware/ff553591%28v=vs.85%29.aspx了解到,DeleteFiles现在什么都不做(对于OS&#39;&gt; win7)。
从过去的时代开始,我们还有一个自定义操作(从installshield移植),它试图删除过时版本的驱动程序。 product.wxs中设置自定义操作的代码:
<CustomAction Id="CA_DeleteDriverSysFile" BinaryKey="CustomActions_dll" DllEntry="DeleteDriverSysFile" />
<InstallExecuteSequence>
...
<Custom Action="CA_DeleteDriverSysFile" After="RemoveFolders">(REMOVE="ALL") Or (feature selection conditions)</Custom>
...
</InstallExecuteSequence>
和C#代码:
[CustomAction]
public static ActionResult DeleteDriverSysFile(Session session)
{
return DoDeleteDriverSysFile(session, MYDRIVER_SYS);
}
static ActionResult DoDeleteDriverSysFile(Session session, string driverFilen)
{
try
{
string driverPath = Path.Combine(new string[] { Environment.SystemDirectory, "drivers", driverFilen });
File.Delete(driverPath);
return ActionResult.Success;
}
catch (Exception e)
{
return ActionResult.Failure;
}
}
非常简单,但是,ActionResult.Failure代码总是被返回..无法从drivers目录中删除该文件,甚至以管理员身份登录。
我在这里做错了什么,我应该怎么做才能删除驱动程序?
相关 - 如何修复安装了此驱动程序的Windows服务器2016框以及卸载现在失败的位置?
答案 0 :(得分:1)
Brian和Sutarmin回答了这个问题。我将CA设置为立即执行,并作为执行安装的用户执行。我还在InstallScope="perMachine"
标记中添加了Package
。
为了修复机器,我去了设备管理器,启用了View-&gt; Hidden并右键单击删除了有问题的驱动程序。然后,通过常规渠道删除软件。