Wix没有删除卸载文件
我已经看到别人在这个问题上的问题,但我不能让它为我工作。我试图习惯Wix,所以我们可以迁移我们的vdproj(我觉得我们已经向前迈出了一步,然后又迈出了4步......最基本的东西已经变得完全不重要,Wix ...但我认为建立安装程序具有完全成熟的声明标记是有价值的)。Wix没有删除卸载文件
我在SharpDevelop的wixproj中有以下wxs。
安装工程。卸载不执行任何操作,并保留安装文件夹和dll。有什么问题?
Files.wxs:
<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="TARGETDIR">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="INSTALLDIR" Name="Client">
<Component Id="InteropDll" Guid="AD09F8B9-80A0-46E6-9E36-9618E2023D66" DiskId="1">
<File Id="Interop.dll" Name="Interop.dll" Source="..\Interop\bin\$(var.Configuration)\Interop.dll" KeyPath="yes" />
<RemoveFile Id="RemoveInterop.dll" Name="Interop.dll" On="uninstall" />
</Component>
</Directory>
</Directory>
</DirectoryRef>
</Fragment>
</Wix>
Setup.wxs:
<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*"
Name="Client Setup"
Language="1033"
Version="1.0.0.0"
UpgradeCode="4A88A3AD-7CB6-46FB-B2FD-F4EADE0218F8"
Manufacturer="Client Setup">
<Package Description="#Description"
Comments="Comments"
InstallerVersion="200"
Compressed="yes"/>
<!--
Source media for the installation.
Specifies a single cab file to be embedded in the installer's .msi.
-->
<Media Id="1" Cabinet="contents.cab" EmbedCab="yes" CompressionLevel="high"/>
<!-- Installation directory and files are defined in Files.wxs -->
<Directory Id="TARGETDIR" Name="SourceDir"/>
<Feature Id="Complete"
Title="Client Setup"
Description="Client Setup"
Level="1">
<ComponentRef Id="InteropDll" />
</Feature>
<!--
Using the Wix UI library
WixUI_InstallDir does not allow the user to choose
features but adds a dialog to let the user choose a
directory where the product will be installed
-->
<Property Id="WIXUI_INSTALLDIR">INSTALLDIR</Property>
<UI Id="WixUI_InstallDir">
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<Property Id="WixUI_Mode" Value="InstallDir" />
<DialogRef Id="BrowseDlg" />
<DialogRef Id="DiskCostDlg" />
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FatalError" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />
<DialogRef Id="PrepareDlg" />
<DialogRef Id="ProgressDlg" />
<DialogRef Id="ResumeDlg" />
<DialogRef Id="UserExit" />
<Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3">1</Publish>
<Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">NOT Installed</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>
<Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
<Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg" Order="1">NOT Installed</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">Installed AND PATCH</Publish>
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
<Property Id="ARPNOMODIFY" Value="1" />
</UI>
<UIRef Id="WixUI_Common" />
</Product>
</Wix>
尝试更改未卸载的组件的GUID。我也一样,它为我工作。这可能是因为GUID已由某些其他产品在注册表中注册。
是的,这是做到了。我设置了*的引导和那个工作... – Jeff
你是男人。我一直在努力解决这个问题几个小时。该特定组件上的GUID为空。我添加了一个GUID,它工作。 – gangt
每次你做一个单独的构建,以确保卸载工作,你必须产生一个新的Guid – TheWommies
我以某种方式让我的项目处于无法卸载每个组件的状态。我不知道如何。我编写了一个程序,该程序将采用.wixproj文件并将所有组件GUID更改为新的GUID并解决了问题(手动删除文件后)。这是基于user593287的答案。
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
namespace GuidFixer
{
public class Program
{
public static void Main(string[] args)
{
string projectFileName = args[0];
string path = Path.GetDirectoryName(projectFileName);
List<string> files = new List<string>();
XmlDocument projectDocument = new XmlDocument();
projectDocument.Load(projectFileName);
XmlNamespaceManager manager = new XmlNamespaceManager(projectDocument.NameTable);
manager.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
// Finds all of the files included in the project.
XmlNodeList nodes = projectDocument.SelectNodes("/msbld:Project/msbld:ItemGroup/msbld:Compile", manager);
foreach (XmlNode node in nodes)
{
string fileName = Path.Combine(path, node.Attributes["Include"].Value);
files.Add(fileName);
}
foreach (string fileName in files)
{
// Lets only do .wxs files
if (!Path.GetExtension(fileName).Equals(".wxs", StringComparison.CurrentCulture))
{
continue;
}
// This will only update files that aren't readonly, make sure
// you check out your files from source control before running.
FileAttributes attributes = File.GetAttributes(fileName);
if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{
continue;
}
bool modified = false;
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true; // space inside tags are still lost
doc.Load(fileName);
foreach (XmlNode node in doc.GetElementsByTagName("Component"))
{
Guid guid = Guid.NewGuid();
string value = guid.ToString("B").ToUpper();
node.Attributes["Guid"].Value = value;
modified = true;
}
// Only update files that were modified, to preserve formatting.
if (modified)
{
doc.Save(fileName);
}
}
}
}
}
我对它做了一些修改而未进行测试,所以祝你好运,这很简单。
很有帮助。我将会注意到未来的用户,虽然它不会将* .wxs作为一个文件arg来处理,但是如果您明确地指出了文件名,它会起作用。 (使用* .wxs会导致'路径中的非法字符'System.IO.Path异常。) –
我遇到了一个类似的问题,当我将所有的GUID转换成大写字符(在兼容性问题的某些规范中需要)时,它不会再出现。没有测试这是否真的是解决问题的方法。也许这与以前的答案是一样的。
值得检查以下注册表项以查看是否列出了您的文件。这可能会导致卸载程序忽略组件,因为它认为它们是共享的。
HKLM\Software\Microsoft\Windows\CurrentVersion\SharedDlls
确保没有其他MSI软件包正在保持您的组件安装。
具体来说,进入控制面板/程序和功能,并确保没有仍旧安装的程序的“旧”版本。
配置似乎没问题。你有没有尝试创建一个详细的卸载日志,看看会发生什么? http://setupanddeployment.com/debugging/msi-log。搜索InstallValidate和RemoveFiles操作并查看它们的操作。 –
不知道如何,但这似乎已经随机开始工作... – Jeff