alled in the user's personal folder
		/// </summary>
		public bool IsUserAddin {
			get {
				if (isUserAddin == null)
					SetIsUserAddin (Description);
				return isUserAddin.Value;
			}
		}
		
		void SetIsUserAddin (AddinDescription adesc)
		{
			string installPath = database.Registry.DefaultAddinsFolder;
			if (installPath [installPath.Length - 1] != Path.DirectorySeparatorChar)
				installPath += Path.DirectorySeparatorChar;
			isUserAddin = adesc != null && Path.GetFullPath (adesc.AddinFile).StartsWith (installPath);
		}
		
		/// <summary>
		/// Path to the add-in file (it can be an assembly or a standalone XML manifest)
		/// </summary>
		public string AddinFile {
			get {
				if (sourceFile == null && addin == null)
					LoadAddinInfo ();
				return sourceFile;
			}
		}
		
		void LoadAddinInfo ()
		{
			if (addin == null) {
				try {
					AddinDescription m = Description;
					sourceFile = m.AddinFile;
					addin = AddinInfo.ReadFromDescription (m);
				} catch (Exception ex) {
					throw new InvalidOperationException ("Could not read add-in file: " + database.GetDescriptionPath (domain, id), ex);
				}
			}
		}
		
		/// <summary>
		/// Description of the add-in
		/// </summary>
		public AddinDescription Description {
			get {
				if (desc != null) {
					AddinDescription d = desc.Target as AddinDescription;
					if (d != null)
						return d;
				}

				var configFile = database.GetDescriptionPath (domain, id);
				AddinDescription m;
				database.ReadAddinDescription (new ConsoleProgressStatus (true), configFile, out m);
				
				if (m == null) {
					try {
						if (File.Exists (configFile)) {
							// The file is corrupted. Remove it.
							File.Delete (configFile);
						}
					} catch {
						// Ignore
					}
					throw new InvalidOperationException ("Could not read add-in description");
				}
				if (addin == null) {
					addin = AddinInfo.ReadFromDescription (m);
					sourceFile = m.AddinFile;
				}
				SetIsUserAddin (m);
				if (!isUserAddin.Value)
					m.Flags |= AddinFlags.CantUninstall;
			