我在这件事上看到了别人的问题,但我无法让它对我有用。我正在努力习惯Wix,所以我们可以迁移我们的vdproj(我觉得我们已经向前迈出了一步,又向后退了4步......最基本的东西已经变成了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 :(得分:41)
尝试更改未卸载的组件的GUID。我尝试了同样的方法,它对我有用。这可能是因为GUID已经由其他产品在注册表中注册。
原因通常是在注册表中搞乱组件引用计数 - 通常在开发过程中发生在 dev-boxes 上。由于使用了SharedDllRefCount concept(传统的,非MSI引用计数),因此经常会发生Installshield软件包。
一些技术细节: Change my component GUID in wix?在干净的虚拟机上进行测试以验证问题是否真实,而不是开发框问题。更改组件GUID可能会产生影响(修补问题等等)。
答案 1 :(得分:7)
确保没有其他MSI软件包保留您的组件。
具体来说,进入控制面板/程序和功能,并确保没有&#34;旧&#34;你的程序版本仍然安装。
答案 2 :(得分:4)
我以某种方式让我的项目处于无法卸载我的每个组件的状态。我不知道怎么做。我编写了一个程序,它将获取.wixproj文件并将所有组件GUID更改为新的GUID并解决了问题(在我手动删除文件之后)。这是基于user593287的答案。
参数应该是项目文件的路径。从命令行运行它的一个例子是:
GuidFixer.exe MyProject.csproj
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);
}
}
}
}
}
我在没有测试的情况下对它进行了一些更改,祝你好运,但它非常简单。
答案 3 :(得分:3)
值得检查以下注册表项以查看是否列出了您的文件。这可能导致卸载程序忽略组件,因为它认为它们是共享的。
HKLM\Software\Microsoft\Windows\CurrentVersion\SharedDlls
答案 4 :(得分:1)
我遇到了类似的问题,当我将所有guid转换为大写时(根据兼容性问题的某些规范中的要求),它似乎不再存在。没有在进攻中测试这是否真的是问题的解决方案。也许这与之前的答案相同。