繁体   English   中英

Win7 上的 VS2010,未调用安装程序中的安装程序类

[英]VS2010 on Win7, installer class within a setup is not called

它是 setupproject 中的一个安装程序类,它位于 winform 项目中。 直到现在我没有任何错误消息,只是没有被调用。 RunInstallerAttribute 设置为 true。

唯一剩下的是“主要空白”,但我不能说,因为 winform 项目需要它。

这是整个代码:

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
   
}

最可能的原因是您没有在安装项目中将程序集添加为自定义操作,因为您没有提到这样做。

它现在有效。 我创建了那些“CommonAppDataFolder”,在 ac# 项目中似乎需要它。 几年前我用 vb.net proejct 制作它,不记得需要它。 它需要安装应用程序,当然具有这些特殊权限,但安装程序的调用并不依赖于它。

最后,我必须在“Commit”中取出使用部分“using (Process process = new Process())”。 因为无论我对 -filename- 和 -argument- 设置什么,它总是会抛出一个错误, - 它无法找到文件夹“C/Program86/....myApp.exe”。

当我发现这个使用部分时,我真的很高兴,以为我现在还剩下什么来关闭最终的安装窗口“安装完成”。 我总是不得不手动关闭这个窗口。

Commit 过程现在看起来像这样:

  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();          
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM