Freigeben über


Problembehandlung bei der Windows Installer-Bereitstellung

Aktualisiert: November 2007

In den Themen dieses Abschnitts werden verschiedene Probleme behandelt, die beim Erstellen von Bereitstellungsprojekten und beim Bereitstellen von Anwendungen auftreten können.

Wenn eine MFC-Anwendung auf einem Computer installiert wird, dessen Gebietsschema nicht Englisch ist, wird sie nicht lokalisiert.

Beim Bereitstellen einer MFC-Anwendung mithilfe eines Visual Studio-Bereitstellungsprojekts werden Abhängigkeiten für die lokalisierten Mergemodule Mfc_loc_e.msm und Mfc_loc_fe.msm nicht erkannt. Die Mergemodule sind in Visual C++ enthalten; der standardmäßige Speicherort bei der Installation ist \Programme\Gemeinsame Dateien\Merge Modules. Wenn Sie eine lokalisierte MFC-Anwendung weitergeben möchten, müssen Sie die zwei Mergemodule manuell zum Bereitstellungsprojekt hinzufügen. Weitere Informationen finden Sie unter Bereitstellung und Abhängigkeiten.

Assembly-Abhängigkeiten wurden nicht erkannt

Wenn eine Projektausgabegruppe, eine Assembly oder ein Mergemodul zu einem Bereitstellungsprojekt hinzugefügt wird, werden alle abhängigen Assemblys automatisch erkannt und dem Projekt hinzugefügt. Wenn eine abhängige Assembly zur Laufzeit mittels des Codes geladen wird, kann sie nicht von den Bereitstellungstools erkannt werden. Sie sollten möglichst keine Assemblys im Code laden oder abhängige Assemblys manuell zum Bereitstellungsprojekt hinfügen. Weitere Informationen finden Sie unter Bereitstellung und Abhängigkeiten.

Dateien können nach der Installation auf einem Webserver nicht gefunden werden

Beim Installieren eines Websetups auf einem Webserver wird durch die VirtualDirectory-Eigenschaft für den Web Application-Ordner und alle Web Custom-Ordner festgelegt, wo in diesen Ordnern befindliche Dateien relativ zum Webstammverzeichnis installiert werden. Wenn diese Eigenschaft leer gelassen wird, werden die Dateien im Webstammordner (inetpub\wwwroot) installiert. Weitere Informationen finden Sie unter VirtualDirectory-Eigenschaft.

Wie wird eine Webanwendung im Stammverzeichnis des Webservers installiert?

Standardmäßig werden beim Installieren einer Webanwendung mittels eines Websetup-Bereitstellungsprojekts Dateien direkt unterhalb des Webstammordners in einem Ordner installiert, der den gleichen Namen wie das Bereitstellungsprojekt hat. Die VirtualDirectory-Eigenschaft des Ordners Web Application bestimmt, wo die Dateien installiert werden. Zum Installieren in das Webstammverzeichnis müssen Sie die VirtualDirectory-Eigenschaft in null ändern (löschen Sie den Standardwert). Weitere Informationen finden Sie unter VirtualDirectory-Eigenschaft.

Mit dem Xcopy-Befehl bereitgestellte Webanwendungen können nicht gedebuggt werden

Wenn eine Webanwendung mit dem Xcopy-Befehl auf einen Webserver kopiert wird, wird Internetinformationsdienste (IIS) nicht automatisch für die Anwendung konfiguriert. Das Debuggen funktioniert nicht, weil der Anwendungsordner nicht als Anwendungsstammverzeichnis erkannt wird.

Nach dem Kopieren müssen Sie den neuen Ordner mithilfe des IIS-Managers als einen Anwendungsstamm festlegen. Darüber hinaus sollten Sie die Berechtigungen für den Bin-Ordner der Anwendung festlegen, um den Download von DLLs zu verhindern.

Tipp:

Ziehen Sie in Erwägung, anstelle des Xcopy-Befehls den Befehl Projekt kopieren oder ein Websetup-Bereitstellungsprojekt zu verwenden. Weitere Informationen finden Sie unter Alternativen bei der Bereitstellung.

Wie deaktiviere ich die Abhängigkeitsanalyse?

Leider gibt es keine direkte Möglichkeit, das Suchen und Auflösen im Rahmen der Abhängigkeitsanalyse zu deaktivieren. Dieses Problem lässt sich aber folgendermaßen umgehen: Deaktivieren Sie im Dialogfeld, das durch Klicken auf die SearchPath-Eigenschaft angezeigt wird, die Option Standardsuchpfade einschließen.

Es müssen noch einige weitere Punkte beachtet werden:

  • Sie müssen die Dateien mit dem Befehl Datei hinzufügen hinzufügen (klicken Sie im Menü Projekt auf Hinzufügen und dann auf Datei). Wenn Sie den Befehl Projektausgabe hinzufügen verwenden (klicken Sie im Menü Projekt auf Hinzufügen und dann auf Projektausgabe), werden aus dem Codeprojekt gemeldete Abhängigkeiten mit eingeschlossen.

  • Beim Erstellen werden möglicherweise eine oder mehrere Warnungen mit dem Inhalt Die Abhängigkeit konnte nicht gefunden werden angezeigt, die jedoch in diesem Fall ignoriert werden können.

  • Wenn Sie die Abhängigkeitsanalyse nur für einige Dateien deaktivieren möchten, können Sie diese Dateien einem Mergemodulprojekt mit deaktivierten Standardsuchpfaden hinzufügen. Verwenden Sie anschließend Mergemodul hinzufügen (klicken Sie im Menü Projekt auf Hinzufügen und dann auf Mergemodul hinzufügen), um die MSM-Datei in einem normalen Setup-Projekt mit aktivierten Standardsuchpfaden aufzunehmen.

Wie deaktiviere ich die Reparatur einer Datei, die von Benutzern geändert oder gelöscht werden soll?

Visual Studio erstellt angekündigte Verknüpfungen, sodass das Programm beim Start überprüft, ob alle Dateien vorhanden sind. Wenn dieses Verhalten so geändert werden soll, dass die Datei nicht repariert wird, wählen Sie die Dateien im Setup-Projekt aus, und ändern Sie die Condition-Eigenschaft in NOT REINSTALL, damit die Dateien bei einer Reparatur nicht neu installiert werden, und deren Transitive-Eigenschaft in TRUE, damit die Bedingung neu ausgewertet wird. Dies hat zur Folge, dass der Installer nach dem erstmaligen Löschen der Datei kurz auf dem Bildschirm blinkt, während er überprüft, ob die Datei nicht neu installiert werden soll. Danach wird der Installer nicht mehr angezeigt.

Wie debugge ich eine benutzerdefinierte Aktions/Installer-Klasse?

Wählen Sie eine der folgenden Methoden:

  • Fügen Sie dem Code einen Aufruf von System.Diagnostics.Debugger.Launch hinzu. Diese Methode startet das Just-In-Time-Debuggen und ermöglicht das Anfügen eines neuen Debuggers an Ihren Code.

  • Fügen Sie dem Code einen Aufruf von MessageBox.Show("Debug Me") hinzu. Wenn das Meldungsfeld angezeigt wird, fügen Sie mithilfe von Visual Studio an den MessageBox-Prozess an. Fügen Sie dann break-Anweisungen (bei Visual C#-Projekten) bzw. stop-Anweisungen (bei Visual Basic-Projekten) im Code ein.

  • Legen Sie die Debugeinstellungen so fest, dass InstallUtil.exe (im Verzeichnis \winnt\Microsoft.net\Framework\Version) gestartet wird, und übergeben Sie die Assembly als Parameter. Wenn Sie F5 drücken, erreichen Sie den Haltepunkt. InstallUtil.exe führt die benutzerdefinierten Aktionen genauso wie MSI aus.

Das Registrieren von Assemblys mit COM-Schnittstellen funktioniert nicht

Dies ist ein bekannter Fehler in RegAsm. Wenn die Assembly eine Abhängigkeit (z. B. zu einer anderen Klassenbibliothek) besitzt, funktioniert RegisterCOM möglicherweise nicht, da zum Abrufen der Registrierungsinformationen RegAsm aufgerufen wird. Da RegAsm im Verzeichnis \obj aufgerufen wird, bleibt die Abhängigkeit unbemerkt, und RegAsm schlägt ohne Benachrichtigung fehl. Am besten umgehen Sie dieses Problem, indem Sie die Assembly manuell aus dem Verzeichnis \bin hinzufügen. Ein weitere Möglichkeit besteht in der Verwendung von RegisterSelfReg.

Außerdem müssen Sie sicherstellen, dass Sie die Registrierung manuell mit RegAsm/CodeBase ausführen. Wenn sich die Assembly nicht an einem freigegebenen Speicherort befindet, wird sie nur gefunden, wenn sie im gleichen Verzeichnis wie der aufrufende Code liegt. /CodeBase gibt das Verzeichnis in die Registrierung ein.

Wie behandle ich Probleme bei Windows Installer-Installationen mithilfe von Protokolldateien?

Windows Installer protokolliert seine Vorgänge beim Installieren von Programmen in einer Protokolldatei. Die Protokolldatei befindet sich im selben Verzeichnis wie die MSI-Datei.

Wie rufe ich eine Protokolldatei für die Installation ab?

Es gibt zwei Methoden:

  • Führen Sie in der Befehlszeile den folgenden Befehl mit dem Protokollierungsschalter aus:

    misexec /i mysetup.msi /l*v mylog.txt
    
  • Speichern Sie Folgendes in einer REG-Datei, und laden Sie diese in die Registrierung:

    REGEDIT4
    
    [HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer]
    "Logging"="voicewarmup"
    "Debug"=dword:00000007
    

    Öffnen Sie dann das \temp-Verzeichnis, und sortieren Sie nach Datum. Die aktuellste msi*.log-Datei stammt von der letzten Installation bzw. Deinstallation.

Wie installiere ich in ein Unterverzeichnis eines zuvor installierten Produkts?

  1. Nehmen wir an, dass das zuvor installierte Produkt (Product 1) installiert ist und über eine Datei mit dem Namen MyFile.txt verfügt.

  2. Verwenden Sie ORCA (aus dem Windows Installer SDK), um die Dateitabelle anzuzeigen, und suchen Sie die Zeile, die MyFile.txt darstellt.

  3. Rufen Sie den Wert der Spalte Component_ ab, und öffnen Sie die Tabelle Component.

  4. Suchen Sie in der Tabelle Component die Zeile mit dem Wert Component_ in der Spalte Component, und rufen Sie ComponentID ab. Kopieren Sie diesen Wert in die Zwischenablage. Schließen Sie ORCA.

  5. Öffnen Sie in Ihrem Setup-Projekt den Editor für Startbedingungen, und fügen Sie eine Windows Installer-Komponentensuche hinzu. Fügen Sie für die ComponentID-Eigenschaft der neuen Suche die ComponentID ein.

  6. Kopieren Sie die Property-Eigenschaft. Diese sollte ungefähr so lauten: COMPONENTEXISTS1.

  7. Öffnen Sie den Dateisystem-Editor, und wählen Sie den Anwendungsordner aus.

  8. Bearbeiten Sie die DefaultLocation-Eigenschaft, sodass sie ungefähr [COMPONENTEXISTS1]MySubFolder entspricht (da der Pfad in COMPONENTEXISTS1 einen nachgestellten Schrägstrich '\' enthält).

Nach Schritt 6 in der vorherigen Vorgehensweise sollten Sie dem Editor für Startbedingungen eine Bedingung hinzufügen, um zu überprüfen, ob die Komponente gefunden wurde, und die Installation blockieren und eine Meldung anzeigen, wenn dies nicht der Fall ist. Die Bedingung würde COMPONENTEXISTS1 lauten (d. h. der Installer darf ausgeführt werden, wenn COMPONENTEXISTS1 nicht leer ist).

Wie installiere ich benutzerdefinierte Webordner an einem nicht standardmäßigen Anschluss?

Zum Installieren benutzerdefinierter Webordner an einem standardmäßig nicht dafür vorgesehenen Anschluss müssen Sie die Installation über die Befehlszeile ausführen. Der Befehl muss die Property-Eigenschaftenwerte für jeden Ihrer Web Custom-Ordner enthalten. In der Regel liegt ein Wert wie NEWWEBPROPERTY1 vor. Außerdem müssen Sie TARGETPORT für den Webanwendungsordner mit einschließen.

Wenn sich der Webserver z. B. an Anschluss 20 befindet, sollte die Befehlszeile folgendermaßen aussehen:

msiexec /i mywebsetup.msi TARGETPORT=20 NEWWEBPROPERTY1PORT=20

Der vorherige Befehl dient nur für einen Webordner. Wenn Sie über mehrere Webordner verfügen, fügen Sie für jeden Ordner ein weiteres PROPERTY=VALUE-Paar hinzu, um den Anschluss jedes aufgelisteten Ordners an den angegebenen Anschluss umzuleiten.

Unter Umständen empfiehlt es sich, das Dialogfeld Installationsadresse zu entfernen: Wenn der Anschluss in der Benutzeroberfläche bei der Installation geändert wird, gilt für die benutzerdefinierten Webordner der Befehlszeilenwert.

Wie installiere ich in den Stamm einer Website?

Um in den Stamm einer Website zu installieren, z. B. c:\inetpub\wwwroot, legen Sie VirtualDirectory auf eine leere Zeichenfolge fest. Sie können dies im Websetup-Projekt oder während der Installation durchführen.

Wie installiere ich eine ServicedComponent in den GAC und konfiguriere sie im COM+-Katalog?

Wenn Sie versuchen, eine ServicedComponent in den globalen Assemblycache (GAC) zu installieren und sie im COM+-Katalog zu konfigurieren, kann der folgende Kompilierungsfehler auftreten:

"Unable to build custom action named 'Primary output from RegServer (Active)' because the file's Folder property is set to Global Assembly Cache."

Diese Installation wird nicht unterstützt, da beim Ausführen benutzerdefinierter Aktionen Assemblys im GAC nicht immer verfügbar sind (nicht an den GAC übergeben werden).

Dieses Problem lässt sich umgehen, indem Sie den Code in verschiedenen Dateien ablegen und den benutzerdefinierten Code für die Aktion in einer Datei speichern, die nach Möglichkeit nicht an den GAC übergeben wird. Manchmal können Sie den Code nicht auf diese Weise verteilen.

Wie führe ich ein Programm nach der Installation automatisch aus?

  1. Erstellen Sie eine VBS-Datei mit folgendem Code:

    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run """" & Property("CustomActionData") & """",7,False
    Set WshShell = Nothing
    
  2. Öffnen Sie das Setup-Projekt, und wechseln Sie zum Editor für benutzerdefinierte Aktionen.

  3. Wählen Sie den Knoten Commit ausführen aus, klicken Sie mit der rechten Maustaste, und fügen Sie eine neue Benutzerdefinierte Aktion hinzu.

  4. Durchsuchen Sie das Dateisystem, um die in Schritt 1 erstellte VBS-Datei hinzuzufügen.

  5. Bearbeiten Sie die CustomActionData-Eigenschaft, indem Sie Folgendes hinzufügen (Ihre Anwendung.exe ist der Name der Anwendungsstartdatei):

    [TARGETDIR]Ihre Anwendung.exe

  1. Erstellen Sie im Verzeichnis des Setup-Projekts eine neue Uninstall.bat-Datei.

  2. Kopieren Sie im Setup-Projekt die ProductCode-Eigenschaft (einen Wert wie [12345678-1234-1234-1234-123412341234]).

  3. Bearbeiten Sie die Datei Uninstall.bat so, dass sie eine Zeile wie die folgende enthält (dabei ist Produktcode der Wert, den Sie in Schritt 2 kopiert haben):

    Msiexec /x Produktcode

  4. Fügen Sie Uninstall.bat zum Anwendungsordner des Setup-Projekts hinzu.

  5. Klicken Sie mit der rechten Maustaste auf Uninstall.bat, und wählen Sie Verknüpfung erstellen aus, um eine Verknüpfung zu erstellen.

  6. Legen Sie die Verknüpfung in den entsprechenden Startmenüordner des Setup-Projekts.

  7. Benennen Sie die Verknüpfung um, zum Beispiel in "<Anwendungsname> deinstallieren".

Wo finde ich Beispiele für das Verwenden von Setup-Projekten?

Beispiele für das Verwenden von Setup-Projekten finden Sie unter Exemplarische Vorgehensweisen für die Windows Installer-Bereitstellung.

Wie plane ich die Bereitstellung von .NET Framework-basierten Anwendungen?

Dieses Handbuch enthält alle notwendigen Informationen zum Planen und Implementieren einer effektiven Bereitstellung von .NET Framework-basierten Anwendungen: Deploying .NET Framework-based Applications.

Wo kann ich das Windows Installer SDK herunterladen?

Sie können das Windows Installer SDK von der Platform SDK-Website herunterladen:

https://www.microsoft.com/downloads/details.aspx?familyid=a55b6b43-e24f-4ea3-a93e-40c0ec4f68e5&displaylang=en

Wo finde ich Aktualisierungen und Hilfeinformationen für Crystal Reports?

Aktualisierte Software und Mergemodule können Sie über die Seite "Downloads & Updates" auf der BusinessObjects.com-Website installieren:

http://support.businessobjects.com/fix/downloads_updates.asp

Wo finde ich einen Bootstrapper für die Installation von .NET Framework zusammen mit meiner Anwendung?

Das Beispiel für einen Microsoft .NET Framework-Setup.exe-Bootstrapper finden Sie unter:

https://www.microsoft.com/downloads/details.aspx?familyid=bf253cfd-1efc-4fc5-ba7e-6a6f21403495&displaylang=en

Das Visual Studio .NET Framework-Bootstrapper-Plug-In finden Sie unter:

http://workspaces.gotdotnet.com/vsboot

Wie löse ich "Nicht behebbarer Buildfehler"-Fehlermeldungen?

Wenn Sie beim Erstellen von Setup- oder Bereitstellungsprojekten eine Fehlermeldung zu einem nicht behebbaren Buildfehler erhalten, lesen Sie folgenden Artikel:

"PRB: 'Unrecoverable Build Error' Error Message When You Build Setup and Deployment Projects" unter https://support.microsoft.com/?id=329214.

Wie löse ich Validierungsfehlermeldungen?

Wenn Sie Fehlermeldungen wie An error occurred when validating. HRESULT = '80040155 erhalten, lesen Sie "PRB: "Unrecoverable Build Error" Error Message When You Build Setup and Deployment Projects" unter https://support.microsoft.com/?id=329214, und folgen Sie den Anweisungen unter "Missing Registrations".

So ändern Sie IIS bei der Bereitstellung mit benutzerdefinierten Aktionen

Der Artikel "Modifying Internet Information Services During Deployment with Custom Actions" unter https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchusingcustomactionstomodifyinternetinformationserverduringdeployment.asp?frame=true bietet Lösungsvorschläge für verschiedene Probleme. Hierzu gehören folgende Elemente:

  • So ändern Sie Einstellungen für IIS-Ordner, die für einen Webordner im Dateisystem-Editor nicht zur Verfügung stehen.

  • So stellen Sie eine Hybridanwendung bereit, die sowohl Visual Basic 6 als auch Visual Basic .NET (oder spätere Versionen) verwendet.

  • Änderungen beim Bereitstellen von Visual Studio .NET-Anwendungen (oder später) im Vergleich zu Visual Basic 6-Anwendungen.

Wo finde ich Informationen über "No Touch Deployment"?

Informationen über "No-Touch Deployment in the .NET Framework" finden Sie unter https://msdn.microsoft.com/library/en-us/dv_vstechart/html/vbtchno-touchdeploymentinnetframework.asp.

Wie stelle ich ASP.NET-Anwendungen bereit?

Weitere Informationen über das Bereitstellen einer ASP.NET-Anwendung mit Visual Studio .NET finden Sie in Deploying an ASP.NET App Using Visual Studio .NET.

Nach der Installation unter Windows 2000 schlägt die Ausführung der Anwendung mit der Warnung fehl, dass MDAC 2.8 erforderlich ist

Jede Anwendung, die auf den System.Data-Namespace verweist, ist von Microsoft Data Access Components (MDAC), Version 2.8 oder höher, abhängig. In den meisten Fällen ist die Datei bereits mit dem Betriebssystem installiert. Unter Windows 2000 Service Pack 3 und früher kann es notwendig sein, die Komponente gemeinsam mit der Anwendung zu installieren. Dazu wird sie dem Bootstrapperpaket hinzugefügt und die Datei während der Installation von Microsoft heruntergeladen. Weitere Informationen finden Sie unter Voraussetzungen für die Bereitstellung (Visual Studio).

Verwandte Knowledge Base-Artikel

Die folgenden Knowledge Base-Artikel enthalten Informationen zu Problemen bei Windows Installer-Bereitstellungen:

Siehe auch

Konzepte

Bereitstellung und Abhängigkeiten

Alternativen bei der Bereitstellung

Referenz

VirtualDirectory-Eigenschaft

Weitere Ressourcen

Bereitstellen von Anwendungen und Komponenten

Exemplarische Vorgehensweisen für die Windows Installer-Bereitstellung