public override bool Execute()
        {
            FrameworkMoniker moniker = null;

            if (!TryParseTargetFrameworkMoniker(TargetFrameworkMoniker, out moniker))
            {
                return(false);
            }

            var framework = GetFrameworkDirectoriesForMoniker(moniker);

            if (framework == null)
            {
                Log.LogWarning("Unable to find framework corresponding to the target framework moniker '{0}'. " +
                               "Framework assembly references will be resolved from the GAC, which might not be " +
                               "the intended behavior.", TargetFrameworkMoniker);
                if (moniker.Identifier.Equals(".NETPortable"))
                {
                    return(CheckPclReferenceAssemblies(moniker));
                }
                return(true);
            }

            ReferenceAssemblyPaths            = FullFrameworkReferenceAssemblyPaths = framework.Directories;
            TargetFrameworkMonikerDisplayName = framework.DisplayName;

            return(true);
        }
		bool CheckPclReferenceAssemblies (FrameworkMoniker moniker)
		{
			// Check for a supported profile
			var check = new FrameworkMoniker (".NETPortable", "v4.0", "Profile24");
			if (GetFrameworkDirectoriesForMoniker (check) != null)
				Log.LogError ("Unsupported PCL Profile '{0}'.", moniker);
			else
				Log.LogError ("PCL Reference Assemblies not installed.");
			return false;
		}
        bool TryParseTargetFrameworkMoniker(string moniker_literal, out FrameworkMoniker moniker)
        {
            moniker = null;
            if (String.IsNullOrEmpty(moniker_literal))
            {
                throw new ArgumentException("Empty moniker string");
            }

            string [] parts = moniker_literal.Split(new char [] { ',' }, StringSplitOptions.RemoveEmptyEntries);

            if (parts.Length < 2 || parts.Length > 3)
            {
                LogInvalidMonikerError(null, moniker_literal);
                return(false);
            }

            string identifier = parts [0];
            string version    = null;
            string profile    = null;

            if (!parts [1].StartsWith("Version="))
            {
                LogInvalidMonikerError("Invalid framework name", moniker_literal);
                return(false);
            }

            version = parts [1].Substring(8);
            if (String.IsNullOrEmpty(version))
            {
                LogInvalidMonikerError("Invalid framework version", moniker_literal);
                return(false);
            }

            if (parts.Length > 2)
            {
                if (!parts [2].StartsWith("Profile="))
                {
                    LogInvalidMonikerError("Invalid framework version", moniker_literal);
                    return(false);
                }

                profile = parts [2].Substring(8);
                if (String.IsNullOrEmpty(profile))
                {
                    LogInvalidMonikerError("Invalid framework profile", moniker_literal);
                    return(false);
                }
            }

            moniker = new FrameworkMoniker(identifier, version, profile);
            return(true);
        }
        bool CheckPclReferenceAssemblies(FrameworkMoniker moniker)
        {
            // Check for a supported profile
            var check = new FrameworkMoniker(".NETPortable", "v4.0", "Profile24");

            if (GetFrameworkDirectoriesForMoniker(check) != null)
            {
                Log.LogError("Unsupported PCL Profile '{0}'.", moniker);
            }
            else
            {
                Log.LogError("PCL Reference Assemblies not installed.");
            }
            return(false);
        }
		Framework GetFrameworkDirectoriesForMoniker (FrameworkMoniker moniker)
		{
			string dirs = String.Join (PathSeparatorAsString, new string [] {
							Environment.GetEnvironmentVariable ("XBUILD_FRAMEWORK_FOLDERS_PATH") ?? String.Empty,
							MSBuildUtils.RunningOnMac ? MacOSXExternalXBuildDir : String.Empty,
							RootPath,
							DefaultFrameworksBasePath });

			string [] paths = dirs.Split (new char [] {Path.PathSeparator}, StringSplitOptions.RemoveEmptyEntries);
			foreach (string path in paths) {
				var framework = GetFrameworkDirectoriesForMoniker (moniker, path);
				if (framework != null)
					return framework;
			}

			return null;
		}
        Framework GetFrameworkDirectoriesForMoniker(FrameworkMoniker moniker)
        {
            string dirs = String.Join(PathSeparatorAsString, new string [] {
                Environment.GetEnvironmentVariable("XBUILD_FRAMEWORK_FOLDERS_PATH") ?? String.Empty,
                MSBuildUtils.RunningOnMac ? MacOSXExternalXBuildDir : String.Empty,
                RootPath,
                DefaultFrameworksBasePath
            });

            string [] paths = dirs.Split(new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string path in paths)
            {
                var framework = GetFrameworkDirectoriesForMoniker(moniker, path);
                if (framework != null)
                {
                    return(framework);
                }
            }

            return(null);
        }
		bool TryParseTargetFrameworkMoniker (string moniker_literal, out FrameworkMoniker moniker)
		{
			moniker = null;
			if (String.IsNullOrEmpty (moniker_literal))
				throw new ArgumentException ("Empty moniker string");

			string [] parts = moniker_literal.Split (new char [] {','}, StringSplitOptions.RemoveEmptyEntries);

			if (parts.Length < 2 || parts.Length > 3) {
				LogInvalidMonikerError (null, moniker_literal);
				return false;
			}

			string identifier = parts [0];
			string version = null;
			string profile = null;

			if (!parts [1].StartsWith ("Version=")) {
				LogInvalidMonikerError ("Invalid framework name", moniker_literal);
				return false;
			}

			version = parts [1].Substring (8);
			if (String.IsNullOrEmpty (version)) {
				LogInvalidMonikerError ("Invalid framework version", moniker_literal);
				return false;
			}

			if (parts.Length > 2) {
				if (!parts [2].StartsWith ("Profile=")) {
					LogInvalidMonikerError ("Invalid framework version", moniker_literal);
					return false;
				}

				profile = parts [2].Substring (8);
				if (String.IsNullOrEmpty (profile)) {
					LogInvalidMonikerError ("Invalid framework profile", moniker_literal);
					return false;
				}
			}

			moniker = new FrameworkMoniker (identifier, version, profile);
			return true;
		}
		//@base_path must be absolute
		Framework GetFrameworkDirectoriesForMoniker (FrameworkMoniker moniker, string base_path)
		{
			if (String.IsNullOrEmpty (base_path)) {
				Log.LogMessage (MessageImportance.Low, "Invalid *empty* base path, ignoring. " + Environment.StackTrace);
				return null;
			}

			Log.LogMessage (MessageImportance.Low, "Looking for framework '{0}' in root path '{1}'",
					moniker, base_path);
			string framework_path = Path.Combine (base_path, Path.Combine (moniker.Identifier, moniker.Version));
			if (!String.IsNullOrEmpty (moniker.Profile))
				framework_path = Path.Combine (framework_path, "Profile", moniker.Profile);

			string redistlist_dir = Path.Combine (framework_path, "RedistList");
			string framework_list = Path.Combine (redistlist_dir, "FrameworkList.xml");
			if (!File.Exists (framework_list)) {
				Log.LogMessage (MessageImportance.Low,
							"Unable to find framework definition file '{0}' for Target Framework Moniker '{1}'",
							framework_list, moniker);
				return null;
			}

			Log.LogMessage (MessageImportance.Low, "Found framework definition list '{0}' for framework '{1}'",
					framework_list, moniker);
			XmlReader xr = XmlReader.Create (framework_list);
			try {
				xr.MoveToContent ();
				if (xr.LocalName != "FileList") {
					Log.LogMessage (MessageImportance.Low, "Invalid frameworklist '{0}', expected a 'FileList' root element.",
							framework_list);
					return null;
				}

				var framework = new Framework ();
				framework.DisplayName = xr.GetAttribute ("Name");
				string framework_dir = xr.GetAttribute ("TargetFrameworkDirectory");
				if (String.IsNullOrEmpty (framework_dir))
					framework_dir = Path.Combine (redistlist_dir, "..");
				else
					framework_dir = Path.Combine (redistlist_dir, framework_dir);

				var directories = new List<string> ();
				directories.Add (MSBuildUtils.FromMSBuildPath (framework_dir));

				string include = xr.GetAttribute ("IncludeFramework");
				if (!String.IsNullOrEmpty (include)) {
					var included_framework = GetFrameworkDirectoriesForMoniker (new FrameworkMoniker (moniker.Identifier, include, null));

					if (included_framework != null && included_framework.Directories != null)
						directories.AddRange (included_framework.Directories);
				}

				framework.Directories = directories.ToArray ();

				return framework;
			} catch (XmlException xe) {
				Log.LogWarning ("Error reading framework definition file '{0}': {1}", framework_list, xe.Message);
				Log.LogMessage (MessageImportance.Low, "Error reading framework definition file '{0}': {1}", framework_list,
						xe.ToString ());
				return null;
			} finally {
				if (xr != null)
					((IDisposable)xr).Dispose ();
			}
		}
        //@base_path must be absolute
        Framework GetFrameworkDirectoriesForMoniker(FrameworkMoniker moniker, string base_path)
        {
            if (String.IsNullOrEmpty(base_path))
            {
                Log.LogMessage(MessageImportance.Low, "Invalid *empty* base path, ignoring. " + Environment.StackTrace);
                return(null);
            }

            Log.LogMessage(MessageImportance.Low, "Looking for framework '{0}' in root path '{1}'",
                           moniker, base_path);
            string framework_path = Path.Combine(base_path, Path.Combine(moniker.Identifier, moniker.Version));

            if (!String.IsNullOrEmpty(moniker.Profile))
            {
                framework_path = Path.Combine(framework_path, "Profile", moniker.Profile);
            }

            string redistlist_dir = Path.Combine(framework_path, "RedistList");
            string framework_list = Path.Combine(redistlist_dir, "FrameworkList.xml");

            if (!File.Exists(framework_list))
            {
                Log.LogMessage(MessageImportance.Low,
                               "Unable to find framework definition file '{0}' for Target Framework Moniker '{1}'",
                               framework_list, moniker);
                return(null);
            }

            Log.LogMessage(MessageImportance.Low, "Found framework definition list '{0}' for framework '{1}'",
                           framework_list, moniker);
            XmlReader xr = XmlReader.Create(framework_list);

            try {
                xr.MoveToContent();
                if (xr.LocalName != "FileList")
                {
                    Log.LogMessage(MessageImportance.Low, "Invalid frameworklist '{0}', expected a 'FileList' root element.",
                                   framework_list);
                    return(null);
                }

                var framework = new Framework();
                framework.DisplayName = xr.GetAttribute("Name");
                string framework_dir = xr.GetAttribute("TargetFrameworkDirectory");
                if (String.IsNullOrEmpty(framework_dir))
                {
                    framework_dir = Path.Combine(redistlist_dir, "..");
                }
                else
                {
                    framework_dir = Path.Combine(redistlist_dir, framework_dir);
                }

                var directories = new List <string> ();
                directories.Add(MSBuildUtils.FromMSBuildPath(framework_dir));

                string include = xr.GetAttribute("IncludeFramework");
                if (!String.IsNullOrEmpty(include))
                {
                    var included_framework = GetFrameworkDirectoriesForMoniker(new FrameworkMoniker(moniker.Identifier, include, null));

                    if (included_framework != null && included_framework.Directories != null)
                    {
                        directories.AddRange(included_framework.Directories);
                    }
                }

                framework.Directories = directories.ToArray();

                return(framework);
            } catch (XmlException xe) {
                Log.LogWarning("Error reading framework definition file '{0}': {1}", framework_list, xe.Message);
                Log.LogMessage(MessageImportance.Low, "Error reading framework definition file '{0}': {1}", framework_list,
                               xe.ToString());
                return(null);
            } finally {
                if (xr != null)
                {
                    ((IDisposable)xr).Dispose();
                }
            }
        }