Irgendwie habe ich mein Projekt in den Zustand gebracht, in dem keine einzige meiner Komponenten deinstalliert werden konnte. Ich habe keine Ahnung, wie das passiert ist. Ich habe ein Programm geschrieben, das eine .wixproj-Datei nimmt und alle Komponenten-GUIDs in neue GUIDs ändert und das hat das Problem gelöst (nachdem ich die Dateien manuell gelöscht habe). Dies basiert auf der Antwort von Benutzer593287.
Das Argument sollte der Pfad zu Ihrer Projektdatei sein. Ein Beispiel für die Ausführung davon von der Befehlszeile wäre:
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 files = new List();
XmlDocument projectDocument = new XmlDocument();
projectDocument.Load(projectFileName);
XmlNamespaceManager manager = new XmlNamespaceManager(projectDocument.NameTable);
manager.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
// Findet alle in das Projekt eingeschlossenen Dateien.
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)
{
// Machen wir nur .wxs-Dateien
if (!Path.GetExtension(fileName).Equals(".wxs", StringComparison.CurrentCulture))
{
continue;
}
// Dies wird nur Dateien aktualisieren, die nicht schreibgeschützt sind, stellen Sie sicher,
// dass Sie Ihre Dateien aus der Quellkontrolle auschecken, bevor Sie dies ausführen.
FileAttributes attributes = File.GetAttributes(fileName);
if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{
continue;
}
bool modified = false;
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true; // Zwischenraum innerhalb der Tags geht immer noch verloren
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;
}
// Nur Dateien aktualisieren, die modifiziert wurden, um die Formatierung beizubehalten.
if (modified)
{
doc.Save(fileName);
}
}
}
}
}
Ich habe einige Änderungen daran vorgenommen, ohne sie zu testen, also viel Glück, es ist jedoch ziemlich unkompliziert.