/// <summary>
        /// Create a new instance, for the specified directory, package name and version.
        /// </summary>
        /// <param name="bamDirectory">Bam directory.</param>
        /// <param name="name">Name.</param>
        /// <param name="version">Version.</param>
        public PackageDefinition(
            string bamDirectory,
            string name,
            string version)
        {
            var definitionName = (null != version) ? System.String.Format("{0}-{1}.xml", name, version) : name + ".xml";
            var xmlFilename = System.IO.Path.Combine(bamDirectory, definitionName);
            this.Initialize(xmlFilename, validate);
            this.Name = name;
            this.Version = version;
            if (null != version)
            {
                this.Description = System.String.Format("A new package called {0} with version {1}", name, version);
            }
            else
            {
                this.Description = System.String.Format("A new package called {0}", name);
            }

            // add required BuildAMation assemblies
            var bamVersion = Graph.Instance.ProcessState.Version;
            if (bamVersion.Build > 0)
            {
                this.BamAssemblies.Add(new BamAssemblyDescription("Bam.Core", bamVersion.Major, bamVersion.Minor, bamVersion.Build));
            }
            else
            {
                this.BamAssemblies.Add(new BamAssemblyDescription("Bam.Core", bamVersion.Major, bamVersion.Minor));
            }

            // add required DotNet assemblies
            {
                var systemDesc = new DotNetAssemblyDescription("System");
                var systemXmlDesc = new DotNetAssemblyDescription("System.Xml");
                var systemCoreDesc = new DotNetAssemblyDescription("System.Core");

                systemDesc.RequiredTargetFramework = "4.0.30319";
                systemXmlDesc.RequiredTargetFramework = "4.0.30319";
                systemCoreDesc.RequiredTargetFramework = "4.0.30319";

                this.DotNetAssemblies.AddRange(new[] { systemDesc, systemXmlDesc, systemCoreDesc });
            }
        }
        private bool ReadDotNetAssemblies(
            System.Xml.XmlReader xmlReader)
        {
            var rootEl = "DotNetAssemblies";
            if (rootEl != xmlReader.Name)
            {
                return false;
            }

            var elName = "DotNetAssembly";
            while (xmlReader.Read())
            {
                if ((xmlReader.Name == rootEl) &&
                    (xmlReader.NodeType == System.Xml.XmlNodeType.EndElement))
                {
                    break;
                }

                if (elName != xmlReader.Name)
                {
                    throw new Exception("Unexpected child element of '{0}'. Found '{1}', expected '{2}'", rootEl, xmlReader.Name, elName);
                }

                var assemblyName = xmlReader.GetAttribute("name");
                var targetFramework = xmlReader.GetAttribute("requiredTargetFramework");

                var desc = new DotNetAssemblyDescription(assemblyName);
                if (null != targetFramework)
                {
                    desc.RequiredTargetFramework = targetFramework;
                }

                this.DotNetAssemblies.AddUnique(desc);
            }

            return true;
        }