Получение пути к приложению во время установки

Я развертываю приложение, и во время установки после того, как пользователь выбирает, где установить приложение, я хочу получить этот путь; Я уже нахожусь в пользовательском действии, но я не знаю, как получить путь к приложению, куда оно будет установлено!

Это Windows Forms, и я разрабатываю с помощью Visual Studio 2010 "C#".

И я использую инструмент развертывания по умолчанию...

Любая идея?

заранее спасибо...


person Stacker    schedule 13.10.2010    source источник
comment
Основываясь на пользовательском действии, я предполагаю, что вы используете установщик Windows. Вы используете Wix или проект установки Visual Studio?   -  person    schedule 13.10.2010
comment
о, извините, я забыл предоставить дополнительную информацию, я отредактирую свой вопрос...   -  person Stacker    schedule 13.10.2010


Ответы (4)


Класс вашего настраиваемого действия должен наследоваться от System.Configuration.Installer.Installer. У него есть параметр под названием Context, который имеет словарь параметров. Словарь содержит ряд полезных переменных об установке, и вы можете добавить некоторые из них.

После того, как вы добавили пользовательский установщик в свой проект установки на панели «Пользовательские действия». Выберите действие «Установить» и задайте для свойства CustomActionData значение:

/targetdir="[TARGETDIR]\"

Затем вы можете получить доступ к пути следующим образом:

[RunInstaller(true)]
public partial class CustomInstaller : System.Configuration.Install.Installer
{
    public override void Install(System.Collections.IDictionary stateSaver)
    {
        base.Install(stateSaver);
        string path = this.Context.Parameters["targetdir"]; 
        // Do something with path.
    } 
}
person Martin Brown    schedule 13.10.2010
comment
Виноват. Вам также необходимо установить свойство CustomActionData. Пост обновлен. - person Martin Brown; 13.10.2010
comment
Как использовать TARGETDIR в Visual C++? - person karikari; 22.02.2011
comment
Эта косая черта меня злила... до сих пор. Оказывается, "[TARGETDIR]\" — это проблема с цитированием в процессе компиляции. (Говорит какой-то парень в Интернете.) nofollow noreferrer">social.msdn.microsoft.com/Forums/en-US/winformssetup/thread/ - person teynon; 23.04.2013
comment
Спасибо. Недавно я хотел вызвать команду regsvr32 в программе, она продолжает появляться, не загружая модуль C:\Program. Причина в том, что вам нужно добавить double кавычки вокруг пути, например path = "\"" + path+"\"";Cheers! - person zionpi; 28.06.2013
comment
Все еще работает под VS 2015. Если я найду время, я создам видео, показывающее, как это делается. - person Squirrel in training; 28.09.2016

Я знаю, что это VB, но это сработало для меня.

Private Sub DBInstaller_AfterInstall(ByVal sender As Object, ByVal e As   System.Configuration.Install.InstallEventArgs) Handles Me.AfterInstall

    MessageBox.Show(Context.Parameters("assemblypath"))

 End Sub
person Johnny Rocker    schedule 11.03.2014
comment
Кажется, это не отвечает на вопрос. - person Yaroslav Shabalin; 12.03.2014

Извините, что публикую ответ на старый пост, но мой ответ может помочь другим.

public override void Install(System.Collections.IDictionary stateSaver)
{
    base.Install(stateSaver);
    rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
    if (rkApp.GetValue("MyApp") == null)
    {
        rkApp.SetValue("MyApp", this.Context.Parameters["assemblypath"]);
    }
    else
    {
        if (rkApp.GetValue("MyApp").ToString() != this.Context.Parameters["assemblypath"])
        {
            rkApp.SetValue("MyApp", this.Context.Parameters["assemblypath"]);
        }
    }
}

public override void Uninstall(System.Collections.IDictionary savedState)
{
    base.Uninstall(savedState);
    rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

    if (rkApp.GetValue("MyApp") != null)
    {
        rkApp.DeleteValue("MyApp", false);
    }
}
person Mou    schedule 29.03.2017

person    schedule
comment
Этот вопрос касается работы с установщиком. Не как получить путь к выполняемой в данный момент программе. - person BDL; 25.01.2019
comment
@BDL Нет, вопрос задает путь к устанавливаемому целевому приложению. Для установщика служб Windows ответом является исполняемая сборка, которую я предоставил. - person Slate; 25.01.2019