public override bool Execute()
        {
            if (string.IsNullOrEmpty(extensionDomain))
            {
                Log.LogError("ExtensionDomain item not found");
                return(false);
            }
            if (addinReferences == null)
            {
                return(true);
            }

            Application app = SetupService.GetExtensibleApplication(extensionDomain);

            if (app == null)
            {
                Log.LogError("Extension domain '{0}' not found", extensionDomain);
                return(false);
            }

            foreach (ITaskItem item in addinReferences)
            {
                string addinId = item.ItemSpec.Replace(':', ',');
                Addin  addin   = app.Registry.GetAddin(addinId);
                if (addin == null)
                {
                    Log.LogError("Add-in '{0}' not found", addinId);
                    return(false);
                }
                if (addin.Description == null)
                {
                    Log.LogError("Add-in '{0}' could not be loaded", addinId);
                    return(false);
                }
                foreach (string asm in addin.Description.MainModule.Assemblies)
                {
                    string   file = Path.Combine(addin.Description.BasePath, Util.NormalizePath(asm));
                    TaskItem ti   = new TaskItem(file);
                    references.Add(ti);
                }
            }
            return(true);
        }
        public static int Main(string[] args)
        {
            if (args.Length == 0 || args [0] == "--help" || args [0] == "help")
            {
                Console.WriteLine("Mono.Addins Setup Utility");
                Console.WriteLine("Usage: mautil [options] <command> [arguments]");
                Console.WriteLine();
                Console.WriteLine("Options:");
                Console.WriteLine("  --path (-p)        Specify the startup path of the application");
                Console.WriteLine("  --registry (-reg)  Specify the add-in registry path");
                Console.WriteLine("  --addinspath (-ap) Specify the default add-ins path of the application");
                Console.WriteLine("                     The path can be absolute or relative to the registry path");
                Console.WriteLine("  --cachepath (-cp)  Specify add-in cache path for the application");
                Console.WriteLine("                     The path can be absolute or relative to the registry path");
                Console.WriteLine("  --package (-pkg)   Specify the package name of the application");
                Console.WriteLine("  -v                 Verbose output. Use multiple times to increase log level");
            }

            int ppos = 0;

            int    verbose      = 1;
            string path         = null;
            string startupPath  = null;
            string addinsPath   = null;
            string databasePath = null;
            string package      = null;
            bool   toolParam    = true;

            while (toolParam && ppos < args.Length)
            {
                if (args [ppos] == "-reg" || args [ppos] == "--registry")
                {
                    if (ppos + 1 >= args.Length)
                    {
                        Console.WriteLine("Registry path not provided.");
                        return(1);
                    }
                    path  = args [ppos + 1];
                    ppos += 2;
                }
                else if (args [ppos] == "-p" || args [ppos] == "--path")
                {
                    if (ppos + 1 >= args.Length)
                    {
                        Console.WriteLine("Startup path not provided.");
                        return(1);
                    }
                    startupPath = args [ppos + 1];
                    ppos       += 2;
                }
                else if (args [ppos] == "-ap" || args [ppos] == "--addinspath")
                {
                    if (ppos + 1 >= args.Length)
                    {
                        Console.WriteLine("Add-ins path not provided.");
                        return(1);
                    }
                    addinsPath = args [ppos + 1];
                    ppos      += 2;
                }
                else if (args [ppos] == "-cp" || args [ppos] == "--cachepath")
                {
                    if (ppos + 1 >= args.Length)
                    {
                        Console.WriteLine("Add-ins cache path not provided.");
                        return(1);
                    }
                    databasePath = args [ppos + 1];
                    ppos        += 2;
                }
                else if (args [ppos] == "-pkg" || args [ppos] == "--package")
                {
                    if (ppos + 1 >= args.Length)
                    {
                        Console.WriteLine("Package name not provided.");
                        return(1);
                    }
                    package = args [ppos + 1];
                    ppos   += 2;
                }
                else if (args [ppos] == "-v")
                {
                    verbose++;
                    ppos++;
                }
                else
                {
                    toolParam = false;
                }
            }

            AddinRegistry reg;

            if (package != null)
            {
                if (startupPath != null || path != null || addinsPath != null || databasePath != null)
                {
                    Console.WriteLine("The --registry, --path, --cachepath and --addinspath options\ncan't be used when --package is specified.");
                    return(1);
                }
                Application app = SetupService.GetExtensibleApplication(package);
                if (app == null)
                {
                    Console.WriteLine("The package could not be found or does not provide add-in registry information.");
                    return(1);
                }
                reg = app.Registry;
            }
            else
            {
                if (startupPath == null)
                {
                    startupPath = Environment.CurrentDirectory;
                }
                reg = path != null ? new AddinRegistry(path, startupPath, addinsPath, databasePath) : AddinRegistry.GetGlobalRegistry();
            }

            try {
                SetupTool setupTool = new SetupTool(reg);
                setupTool.VerboseOutputLevel = verbose;
                return(setupTool.Run(args, ppos));
            } catch (Exception ex) {
                Console.WriteLine(ex);
                return(-1);
            }
            finally {
                reg.Dispose();
            }
        }