2016-04-22 73 views
0

它是setupproject中的安装程序类,它位于winform项目中。直到现在,我确实拥有任何errro消息,它只是不叫。 RunInstallerAttribute设置为true。Win7上的VS2010,安装程序中的安装程序类不叫

剩下的唯一东西就是“主要空白”,但我不能说出来,导致winformproject是neede。

这里是整个代码:

using System; 
using System.Collections; 
using System.Diagnostics; 
using System.ComponentModel; 
using System.Configuration.Install; 
using System.Security.AccessControl; 
using System.Security.Principal; 
using System.IO; 
using System.Windows.Forms; 
using System.Text; 
using System.Threading; 

[RunInstaller(true)] 
partial class MyInstaller : Installer 
{ 

    public MyInstaller() 
    {  
     MessageBox.Show("MyInstaller"); 
     InitializeComponent(); 
    } 


    #region "onAfter" 
    protected override void OnAfterInstall(IDictionary savedState) 
    { 

     base.OnAfterInstall(savedState); 
    } 


    protected override void OnAfterRollback(IDictionary savedState) 
    { 

     base.OnAfterRollback(savedState); 
    } 


    protected override void OnAfterUninstall(IDictionary savedState) 
    { 

     base.OnAfterUninstall(savedState); 
    } 
    #endregion 

    #region "OnBefore" 


    protected override void OnBeforeInstall(IDictionary savedState) 
    { 
     base.OnBeforeInstall(savedState); 
    } 


    protected override void OnBeforeRollback(IDictionary savedState) 
    { 

     base.OnBeforeRollback(savedState); 
    } 


    protected override void OnBeforeUninstall(IDictionary savedState) 
    { 

     base.OnBeforeUninstall(savedState); 
    } 
    #endregion 

    #region "OnCommitt" 

    protected override void OnCommitted(IDictionary savedState) 
    { 

     base.OnCommitted(savedState); 
    } 


    protected override void OnCommitting(IDictionary savedState) 
    { 

     base.OnCommitting(savedState); 
    } 
    #endregion 

    #region "Rollback" 
    public override void Rollback(IDictionary savedState) 
    { 
     base.Rollback(savedState); 
     try 
     { 
      string fileName = savedState["myExe"].ToString(); 
      //MsgBox("Rollback ..." & fileName) 
      if (File.Exists(fileName)) 
      { 
       File.Delete(fileName); 
      } 
     } 


     catch (InstallException ex) 
     { 

      MessageBox.Show("Uninstall" + ex.ToString()); 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show("Uninstall" + ex.ToString()); 
     } 
    } 

    #endregion 

    #region "Uninstall" 
    public override void Uninstall(IDictionary savedState) 
    { 
     try 
     { 
      string fileName = savedState["myExe"].ToString(); 

      if (File.Exists(fileName)) 
      { 
       File.Delete(fileName); 
      } 

      base.Uninstall(savedState); 

     } 
     catch (InstallException ex) 
     { 
      MessageBox.Show("Uninstall" + ex.ToString()); 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show("Uninstall" + ex.ToString()); 
     } 


    } 

    #endregion 

    #region "Install" 
    public override void Install(IDictionary savedState) 
    { 
     MessageBox.Show("Install "); 
     string strTargetPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "myTest");  
     savedState.Add("myExe", strTargetPath);   
     base.Install(savedState); 

    } 
    #endregion 

    #region "Commit" 
    public override void Commit(IDictionary savedState) 
    { 


     string strPath = ""; 

     try 
     { 


      strPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
      strPath = Path.Combine(strPath, "myTest\\myApp.exe");   

      using (Process process = new Process()) 
      { 
       process.StartInfo.FileName = "myApp.exe"; 
       process.StartInfo.Arguments = strPath; 
       process.StartInfo.UseShellExecute = false; 
       process.StartInfo.RedirectStandardOutput = true; 
       process.StartInfo.RedirectStandardError = true; 

       StringBuilder output = new StringBuilder(); 
       StringBuilder error = new StringBuilder(); 

       using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false)) 
       using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false)) 
       { 
        process.OutputDataReceived += (sender, e) => 
        { 
         if (e.Data == null) 
         { 
          outputWaitHandle.Set(); 
         } 
         else 
         { 
          output.AppendLine(e.Data); 
         } 
        }; 
        process.ErrorDataReceived += (sender, e) => 
        { 
         if (e.Data == null) 
         { 
          errorWaitHandle.Set(); 
         } 
         else 
         { 
          error.AppendLine(e.Data); 
         } 
        }; 

        process.Start(); 

        process.BeginOutputReadLine(); 
        process.BeginErrorReadLine(); 

        if (process.WaitForExit(1000) && 
         outputWaitHandle.WaitOne(1000) && 
         errorWaitHandle.WaitOne(1000)) 
        { 
         // Process completed. Check process.ExitCode here. 
        } 
        else 
        { 
         // Timed out. 
        } 
       } 
      } 

     } 

     catch (Exception ex) 
     { 
      MessageBox.Show("Commit " + ex.ToString()); 
      Application.Exit();   
     } 

    } 


    #endregion 

} 

回答

0

最可能的原因是你没有添加组件的安装项目自定义操作,因为你没有提到这样做。

+0

嗨菲尔,以及我havnt提及,但我做到了这样。 (我昨天一次又一次地准备了我的问题,最后我忘了把它放进去,甚至是在整封信里面) – goran

0

它现在有效。我创建了那些“CommonAppDataFolder”,看起来是它在c#项目中所需要的。几年前,我用vb.net proejct做了它,不记得它是需要的。它需要安装该应用程序,当然还有这些特权,但安装程序的调用并不取决于它。

And finallay我必须在“Commit”中使用部分“using(Process process = new Process())”。原因不管我给-filename-和 -argument-,它总会抛出一个错误, - 它无法找到文件夹“C/Program86/... .myApp.exe”。

当我发现使用部分时,我非常高兴,因为我现在得到了什么来关闭最终安装窗口“安装完成”。我总是需要手动关闭这个窗口。

提交程序现在看起来是这样的:

public override void Commit(IDictionary savedState) 
    { 
     string strPath = ""; 
     var myProcess = new Process(); 

     try 
     { 
      base.Commit(savedState); 

      strPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Test");   
      strPath = Path.Combine(strPath, "myApp.exe");   
      myProcess.StartInfo.FileName = strPath; 
      myProcess.StartInfo.CreateNoWindow = false; 
      myProcess.Start(); 
      myProcess.WaitForExit(500); 
      myProcess.Close(); 
      myProcess = null;   
     }   

     catch (Exception ex) 
     { 
      MessageBox.Show("public override void Commit " + ex.ToString()); 
      Application.Exit();   
     } 
    }