2016-04-22 6 views
0

セットアッププロジェクト内のインストーラクラスです。これはwinformプロジェクト内にあります。 今まで私はhavすべてのerrroメッセージを、ちょうど呼ばれていませんでした。 RunInstallerAttributeはtrueに設定されています。Win7のVS2010では、セットアップ内のインストーラクラスは呼び出されません。

残っているのは「メインボイド」ですが、私はそれを置くことができません。これはwinformprojectの必要性を引き起こします。ここで

は、全体のコードです:

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プロジェクトでそれを作った。もちろん、それらの特別な権利を持つアプリをインストールする必要がありますが、インストーラの呼び出しはそれに依存しませんでした。

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();   
     } 
    } 
関連する問題