[Mono-dev] AssemblyInstaller

Nicholas Salerno nsalerno at securewatch24.com
Mon Sep 20 12:37:58 EDT 2010


Thank you for the clarification.  All that said, it still seems like ManagedInstallerClass.InstallHelper would utilize AssemblyInstaller.  ManagedInstallerClass is COM visible, which may imply some things.  AssemblyInstaller appears to be a plain old .NET class.  I don't have any objection to ManagedInstallerClass, I'm just trying to understand where implementations should fall into place.

Nicholas

-----Original Message-----
From: Kornél Pál [mailto:kornelpal at gmail.com] 
Sent: Saturday, September 18, 2010 5:04 AM
To: Nicholas Salerno
Cc: mono-devel-list at lists.ximian.com
Subject: Re: [Mono-dev] AssemblyInstaller

Hi,

See 
http://msdn.microsoft.com/en-us/library/system.configuration.install.managedinstallerclass.installhelper.aspx

That page documents exactly what it does.

installutil.exe should be implemented as sometihng like the following 
(I've tried it and it works on MS.NET):

class Program
{
	static void Main(string[] args)
	{
		try
		{
			ManagedInstallerClass.InstallHelper(args);
		}
		catch (Exception ex)
		{
			Console.WriteLine(ex.Message);
		}
	}
}


Arguments accepted are documented here:
http://msdn.microsoft.com/en-us/library/50614e95.aspx

So all the functionality of installutil.exe should be moved to 
ManagedInstallerClass. Even the help screen comes as an exception.

Note that no version headers are not printed by ManagedInstallerClass 
that should remain in installutil.exe and some appropriate status code 
should be set on return as well.

Based on the following example I belive that 
IManagedInstaller.ManagedInstall does exactly the same except that 
exceptions are not returned:

class Program
{
	static void Main(string[] args)
	{
		try
		{
			IManagedInstaller installer = new ManagedInstallerClass();
			StringBuilder sb = new StringBuilder();
			foreach (string arg in args)
			{
				sb.Append('"');
				sb.Append(arg.Replace("\\", "\\\\").Replace("\"", "\\\""));
				sb.Append("\" ");
			}
			if (sb.Length > 0)
				sb.Remove(sb.Length - 1, 1);
			installer.ManagedInstall(sb.ToString(), 0);
		}
		catch (Exception ex)
		{
			Console.WriteLine(ex.Message);
		}
	}
}

A search for hInstall in Platform SDK headers resulted in matches only 
from MsiQuery.h. So that method is most likely used by Windows Installer 
and I would guess that at least errors are reported using hInstall 
rather than exceptions.

Kornél

Nicholas Salerno write:
> Vincent Povirk wrote:
>> I don't know much about these classes, but my impression was that
>> ManagedInstallerClass corresponds most directly to installutil.exe,
>> but that that class must use AssemblyInstaller. It seems installutil
>> duplicates some functionality of both of those, and it should probably
>> call on them instead.
>
> The ManagedInstallerClass is scarcely documented in MSDN (unlike the other classes in the System.Configuration.Install namespace).  Also, the description states that the class is not meant to be directly used by one's code.  I don't know much about this ManagedInstallerClass other than it doesn't seem to fit with the model established by the Installer class.  It doesn't derive from Installer.  It implements IManagedInstaller, an interface I don't know much about.
>
> I am familiar with the Installer class that derives from Component and is meant to be subclassed.  The AssemblyInstaller class seems to be the class to use if one wants to programmatically install and uninstall .NET components (without having to execute shell commands to instalutil).  I do this in Windows.
>
> If nobody has any objections I would like to submit a patch that implements the AssemblyInstaller class.
>
> Nicholas
>


More information about the Mono-devel-list mailing list