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> 
+0

配置似乎没问题。你有没有尝试创建一个详细的卸载日志,看看会发生什么? http://setupanddeployment.com/debugging/msi-log。搜索InstallValidate和RemoveFiles操作并查看它们的操作。 –

+0

不知道如何,但这似乎已经随机开始工作... – Jeff

尝试更改未卸载的组件的GUID。我也一样,它为我工作。这可能是因为GUID已由某些其他产品在注册表中注册。

+1

是的,这是做到了。我设置了*的引导和那个工作... – Jeff

+0

你是男人。我一直在努力解决这个问题几个小时。该特定组件上的GUID为空。我添加了一个GUID,它工作。 – gangt

+2

每次你做一个单独的构建,以确保卸载工作,你必须产生一个新的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); 
       } 
      } 
     }   
    } 
} 

我对它做了一些修改而未进行测试,所以祝你好运,这很简单。

+0

很有帮助。我将会注意到未来的用户,虽然它不会将* .wxs作为一个文件arg来处理,但是如果您明确地指出了文件名,它会起作用。 (使用* .wxs会导致'路径中的非法字符'System.IO.Path异常。) –

我遇到了一个类似的问题,当我将所有的GUID转换成大写字符(在兼容性问题的某些规范中需要)时,它不会再出现。没有测试这是否真的是解决问题的方法。也许这与以前的答案是一样的。

值得检查以下注册表项以查看是否列出了您的文件。这可能会导致卸载程序忽略组件,因为它认为它们是共享的。

HKLM\Software\Microsoft\Windows\CurrentVersion\SharedDlls 

确保没有其他MSI软件包正在保持您的组件安装。

具体来说,进入控制面板/程序和功能,并确保没有仍旧安装的程序的“旧”版本。