выполнение установленного файла в обработчике событий класса .net installer - PullRequest
0 голосов
/ 07 июля 2011

Я уже делал несколько приложений .Net, но это мой первый раз с установщиком.

Мой установщик помещает файл (расширение .esriAddIn - по сути, это zip-архив, который распаковывается на дом пользователя.каталогом продукта ESRI при его выполнении) в файловой системе пользователя и затем пытается выполнить этот файл после завершения программы установки.

Однако кажется, что программа установки все еще обращается к моему файлу к моменту его выполнения, ипроцесс завершается неудачно с сообщением «... возможно, файл используется ...»

Я пытался выполнить процесс в переопределенной функции OnCommitted, в обработчике события Committed и в нескольких других местах, нонет радости

Может кто-нибудь сказать мне, как выполнить файл в то время, когда установщик не держит его?

Класс установщика в настоящее время выглядит следующим образом:

protected override void OnCommitted(IDictionary savedState)
{
    base.OnCommitted(savedState);

    string installFolder = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
    string addinFile = @"\<<file name>>.esriAddIn";

    System.Diagnostics.Process.Start(installFolder + addinFile);
}

Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 07 июля 2011

Если кому-то интересно, то удалось решить эту проблему, и не было задействовано никакого большого мастерства. Наверное, я никогда раньше не пробовал эту комбинацию:

public partial class Installer : System.Configuration.Install.Installer
{
    private string m_addInLocation;

    public Installer()
    {
        InitializeComponent();

        this.Committed += new InstallEventHandler(this.onCommit);
    }

    protected override void OnCommitted(IDictionary savedState)
    {
        this.m_addInLocation = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\<<add-in name>>.esriAddIn";

        // raise the committed event - ensure this happens after add in location has been determined
        base.OnCommitted(savedState);
    }

    private void onCommit(object sender, EventArgs e)
    {
        try
        {
            System.Diagnostics.Process.Start(this.m_addInLocation);
        }
        catch (Exception) { MessageBox.Show("..."); }
    }
}
...