Zunächst einmal, ja, ich weiß, dass die VS-Setup-Projekte böse sind. Es ist, was ich habe, mit zu arbeiten. Ich habe auch mehrere ähnliche Fragen gesehen, aber sie gehen entweder unbeantwortet oder sie nicht mit meiner Situation nahe genug für die Antwort zu arbeiten (oder sie harp auf über die Übel der VS Setup-Projekte und die Wunder von WiX).
Ich habe ein Installationsprojekt für meine Anwendung. Das Kopieren von Dateien hat gut funktioniert, aber ich musste nach dem Kopieren der Dateien zwei benutzerdefinierte Aktionen durchführen. Ich erstellte eine Installer-Klasse und richtete sie als benutzerdefinierte Aktion im Setup-Projekt ein, und das Skelett davon (das keine Arbeit verrichtete, sondern nur einen Dialog anzeigte, damit ich einen Debugger anschließen und mich umsehen konnte) funktionierte einwandfrei. Dann stellte ich fest, dass ich Parameter von der MSI an meine benutzerdefinierte Aktion übergeben musste, damit ich über die Context-Eigenschaft der Installer-Klasse auf sie zugreifen konnte.
Hier ist der aktuelle Code der Installer-Klasse (einige Namen wurden zum Schutz der Unschuldigen geändert). Sie tut im Grunde nichts anderes, als zum richtigen Zeitpunkt einen Dialog anzuzeigen (nachdem die Dateien kopiert wurden, aber bevor die Installation abgeschlossen ist):
namespace MyApp.Install.CustomSetup
{
[RunInstaller(true)]
public partial class MyAppCustomInstallActions : System.Configuration.Install.Installer
{
public MyAppCustomInstallActions()
{
InitializeComponent();
}
protected override void OnAfterInstall(IDictionary savedState)
{
try
{
base.OnAfterInstall(savedState);
if (MessageBox.Show(
"Custom Action OnAfterInstall successfully integrated. You can attach a debugger if desired. Do you wish to perform the custom actions?",
"DEBUG", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;
SetEditablePermissionOnFolder(savedState);
SetApplicationSettingsFromWizard(savedState);
}
catch (Exception ex)
{
Context.LogMessage(ex.ToString());
throw;
}
}
private void SetApplicationSettingsFromWizard(IDictionary savedState)
{
//TODO: Implement
}
private void SetEditablePermissionOnViewerFolder(IDictionary savedState)
{
//TODO: Implement
}
}
}
Der Plan ist, die benutzerdefinierten Aktionen zum Laufen zu bringen, dann das Dialogfeld zu entfernen und es einfach zu tun.
Hier ist die Zeichenkette für CustomActionData für die Aktion Install der benutzerdefinierten Aktionen des Setup-Projekts:
/phonenumber=[phonenumber] /thirdpartyinstallpath1="[thirdpartyinstallpath1]\" /thirdpartyinstallpath2="[thirdpartyinstallpath2]\" /thirdpartyinstallpath3="[thirdpartyinstallpath3]\"
Wenn ich diese Parameterzeichenfolge nicht verwende, ist alles in Ordnung, aber ich habe keine Parameter. Wenn ich diese Zeichenfolge angebe, schlägt das Installationsprogramm fehl, bevor mein eigenes Dialogfeld angezeigt wird, und zeigt zwei Fehler an: "Exception occurred while initializing the installation: Could not load file or assembly 'file:///C:\Windows\SysWOW64\Files' or one of its dependencies. The system cannot find the file specified"
und "Error 1001. Could not find file C:\Program Files (x86)\MyCompany\MyApp\MyApp.Install.CustomSetup.InstallState"
.
Was mache ich falsch? Mache ich etwas falsch? Gibt es eine Lösung, ohne dass ich ein Installationsprogramm mit einem anderen Framework neu erstellen muss?
EDIT: Ich habe herausgefunden, dass, wenn ich alles außer dem Telefonnummern-Parameter entferne und [PHONENUMBER] in Anführungszeichen setze, dieser Parameter übergeben werden kann. Allerdings kann ich keinen der Verzeichnispfade übergeben; ich habe es mit [INSTALLDIR] genau so versucht, wie es in mehreren Blogs und Anleitungen beschrieben wird, aber ohne Erfolg.