2009-10-26 3 views
0

У меня есть проект установки с пользовательским классом установщика, который запускает приложение в конце установки. В настройке я создаю ярлык для вывода приложения. Установка прекрасна. Но когда я нажимаю на ярлык, перезагрузка установщика и запуск приложения одновременно? Зачем?Проблема с ярлыком в проекте установки C#

Нет, код моего пользовательского класса:

/// <summary> 
/// Installer class to automatically launch the application at the end of the installation/ 
/// </summary> 
[RunInstaller(true)] 
public partial class InstallerStartApplication : Installer 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="InstallerStartApplication"/> class. 
    /// </summary> 
    public InstallerStartApplication() 
    {    
     InitializeComponent();    
    } 

    /// <summary> 
    /// Raises the <see cref="E:System.Configuration.Install.Installer.AfterInstall"/> event. 
    /// </summary> 
    /// <param name="savedState">An <see cref="T:System.Collections.IDictionary"/> that contains the state of the computer after all the installers contained in the <see cref="P:System.Configuration.Install.Installer.Installers"/> property have completed their installations.</param> 
    protected override void OnAfterInstall(IDictionary savedState) 
    { 
     base.OnAfterInstall(savedState); 


    } 

    // Override the 'Install' method. 
    public override void Install(IDictionary savedState) 
    { 
     base.Install(savedState); 
    } 

    // Override the 'Commit' method. 
    public override void Commit(IDictionary savedState) 
    {   
     base.Commit(savedState); 

     try 
     { 
      Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)); 
      Process.Start(Path.Combine(Directory.GetCurrentDirectory(), "IERssNotificator.exe"), "-c"); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex); 
     } 
    } 

    // Override the 'Rollback' method. 
    public override void Rollback(IDictionary savedState) 
    { 
     base.Rollback(savedState); 
    } 


} 

я запускаю это в установке и фиксации пользовательских действий.

ответ

1

ОК, я нашел проблему. Ошибка в коде пользовательского класса установщика:

Process.Start(Path.Combine(Directory.GetCurrentDirectory(), "IERssNotificator.exe"), "-c"); 

Этот запуск процесса, а не асинхронный и установка никогда не закончится. Именно поэтому он всегда перезапускает настройку.

Я изменяю свой код и просматриваю процесс в отдельный поток, и поэтому настройка завершена.

1

Проект установки размещает специальный тип ярлыка. Это не просто запуск программы. Сначала он проверяет наличие всех файлов, установленных с программой. Если они это сделают, он запускает программу, если они не запускают программу из кэша msi, чтобы переустановить отсутствующие файлы.

У вас есть действия после установки, которые удаляют некоторые из установленных файлов?

+0

Нет, см. Мой код ... Выше – Coolweb

+0

Есть ли способ создать ярлык * normal * вместо сортировки, запускающей установщик? –

+0

Я не нашел его. В конце я создал ярлык в действии Commit с помощью WinAPI. Вы можете использовать WScript.Shell или http://www.msjogren.net/dotnet/eng/samples/dotnet_shelllink.asp библиотеку –