33 Stimmen

Wix Entfernt Dateien beim Deinstallieren nicht

Ich habe die Fragen anderer zu diesem Thema gesehen, aber ich kann es nicht für mich zum Laufen bringen. Ich versuche mich an Wix zu gewöhnen, damit wir unsere vdproj's migrieren können (ich habe das Gefühl, dass wir hier einen Schritt vorwärts und vier Schritte zurück gemacht haben...die einfachsten Dinge sind mit Wix völlig nicht trivial geworden...aber ich sehe den Wert darin, einen vollwertigen deklarativen Markup zur Erstellung von Installationsprogrammen zu haben).

Ich habe das folgende wxs in einem Wixproj in SharpDevelop:

Die Installation funktioniert. Die Deinstallation bewirkt nichts und lässt den Installationsordner und die dll an Ort und Stelle. Wo liegt das Problem?

Dateien.wxs:

Setup.wxs:

        INSTALLDIR

            1
            "1"]]>

            1

            NOT Installed
            Installed AND PATCH

            1
            1
            NOT WIXUI_DONTVALIDATEPATH
            "1"]]>
            WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"
            1
            1

            NOT Installed
            Installed AND NOT PATCH
            Installed AND PATCH

            1

            1
            1
            1

55voto

Jony Lalwani Punkte 2051

Versuchen Sie, die GUID der Komponenten zu ändern, die nicht deinstalliert werden. Ich habe dasselbe versucht und es hat bei mir funktioniert. Es kann daran liegen, dass die GUID bereits im Registry von einem anderen Produkt registriert ist.

Die Ursache liegt in der Regel an der durcheinandergekommenen Komponenten-Referenzzählung in der Registry - oft passiert dies auf Entwickler-Boxen während der Entwicklung. Kann auch oft bei Installshield-Paketen passieren, aufgrund ihrer Verwendung des SharedDllRefCount-Konzepts (veraltetes, nicht-MSI-Referenzzählen).

Einige technische Details: Ändere meine Komponenten-GUID in Wix? Testen Sie in einer sauberen virtuellen Umgebung, um zu überprüfen, ob das Problem real ist und kein Problem der Entwickler-Box. Die Änderung von Komponenten-GUIDs kann Auswirkungen haben (Patch-Probleme usw.).

9voto

Dave Mackersie Punkte 1003

Stellen Sie sicher, dass keine anderen MSI-Pakete Ihre Komponenten installiert haben.

Gehen Sie speziell in die Systemsteuerung / Programme und Funktionen und stellen Sie sicher, dass keine "alte" Version Ihres Programms noch installiert ist.

5voto

Armin Sadeghi Punkte 708

Es wäre sinnvoll, den folgenden Registrierungsschlüssel zu überprüfen, um zu sehen, ob Ihre Dateien aufgeführt sind. Dies kann dazu führen, dass das Deinstallationsprogramm die Komponenten ignoriert, da es sie für gemeinsam genutzt hält.

HKLM\Software\Microsoft\Windows\CurrentVersion\SharedDlls

4voto

Joel McBeth Punkte 1218

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.

1voto

user3199331 Punkte 11

Ich habe ein ähnliches Problem erlebt, das anscheinend nicht mehr auftrat, als ich alle GUIDs in Großbuchstaben umgewandelt habe (wie in einigen Spezifikationen für Kompatibilitätsprobleme erforderlich). Habe nicht ausführlich getestet, ob das wirklich die Lösung für das Problem war. Vielleicht ist dies dasselbe wie die vorherige Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X