7

I am writing a InstallerClass using C# as a custom action for my installer, and I can successfully run an external exe (installation) using the InstallerClass, but when I try to use /quiet in the InstallerClass, it does not install the exe. But I can successfully install this in silent mode using /quiet in the command prompt.

Is there any reason for this or otherwise how to install in silent mode using C#?

Following is the code I use within the Commit method (overriden):

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = pathExternalInstaller;
p.StartInfo.Arguments = "/quiet";
p.Start();
Zoe
  • 27,060
  • 21
  • 118
  • 148
Dulini Atapattu
  • 2,735
  • 8
  • 33
  • 47

5 Answers5

8

Here is what I use to do a quiet Install and Uninstall:

    public static bool RunInstallMSI(string sMSIPath)
    {
        try
        {
            Console.WriteLine("Starting to install application");
            Process process = new Process();
            process.StartInfo.FileName = "msiexec.exe";
            process.StartInfo.Arguments = string.Format(" /qb /i \"{0}\" ALLUSERS=1", sMSIPath);      
            process.Start();
            process.WaitForExit();
            Console.WriteLine("Application installed successfully!");
            return true; //Return True if process ended successfully
        }
        catch
        {
            Console.WriteLine("There was a problem installing the application!");
            return false;  //Return False if process ended unsuccessfully
        }
    }

    public static bool RunUninstallMSI(string guid)
    {
        try
        {
            Console.WriteLine("Starting to uninstall application");
            ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe", string.Format("/c start /MIN /wait msiexec.exe /x {0} /quiet", guid));
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            Process process = Process.Start(startInfo);
            process.WaitForExit();
            Console.WriteLine("Application uninstalled successfully!");
            return true; //Return True if process ended successfully
        }
        catch
        {
            Console.WriteLine("There was a problem uninstalling the application!");
            return false; //Return False if process ended unsuccessfully
        }
    }
Mark Kram
  • 5,672
  • 7
  • 51
  • 70
  • I called `RunInstallMSI` within the override for Commit in the InstallerClass, but it says that another installation is already in progress and does not allow to install the external exe during application installation.... any reason why or any solution??? – Dulini Atapattu Aug 29 '11 at 05:34
3

This works for me.

Process process = new Process();
process.StartInfo.FileName = @ "C:\PATH\Setup.exe";
process.StartInfo.Arguments = "/quiet";
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.Start();
process.WaitForExit();
Zoe
  • 27,060
  • 21
  • 118
  • 148
Pushpak Gupta
  • 81
  • 1
  • 7
0

Have you tried using the /Q or /QB parameter that is listed in the Installation parameters? It might look something like this:

p.StartInfo.Arguments = "/Q";

I got that out of this document: http://msdn.microsoft.com/en-us/library/ms144259(v=sql.100).aspx

ijb109
  • 942
  • 1
  • 19
  • 30
0

Here is my logic to silent install an app for all users:

public void Install(string filePath)
{
    try
    {
        Process process = new Process();
        {
            process.StartInfo.FileName = filePath;
            process.StartInfo.Arguments = " /qb ALLUSERS=1";
            process.EnableRaisingEvents = true;
            process.Exited += process_Exited;
            process.Start();
            process.WaitForExit();
        }
    }
    catch (InvalidOperationException iex)
    {
        Interaction.MsgBox(iex.Message, MsgBoxStyle.OkOnly, MethodBase.GetCurrentMethod().Name);
    }
    catch (Exception ex)
    {
        Interaction.MsgBox(ex.Message, MsgBoxStyle.OkOnly, MethodBase.GetCurrentMethod().Name);
    }
}

private void process_Exited(object sender, EventArgs e)
{
    var myProcess = (Process)sender;
    if (myProcess.ExitCode == 0)
        // do yours here...
}
Leebeedev
  • 2,126
  • 22
  • 31
0
string filePath = @"C:\Temp\Something.msi";    
Process.Start(filePath, @"/quiet").WaitForExit();

It worked for me.

Masuri
  • 894
  • 2
  • 9
  • 19