private static bool IsStrongNamed(ParsedAssemblyName name)
 {
     return(name.PublicKeyToken != null && name.PublicKeyToken != "null");
 }
 private static bool IsPartial(ParsedAssemblyName name, Version version)
 {
     return(version == null || name.Culture == null || name.PublicKeyToken == null);
 }
        static string GetRemappedPublicKeyToken(ref ParsedAssemblyName name, Version version)
        {
            if (name.Retargetable.GetValueOrDefault() && version < SilverlightVersion)
            {
                return(null);
            }
            if (name.PublicKeyToken == "ddd0da4d3e678217" && name.Name == "System.ComponentModel.DataAnnotations" && name.Retargetable.GetValueOrDefault())
            {
                return(PublicKeyTokenWinFX);
            }
            if (SilverlightVersionMinimum <= version && version <= SilverlightVersionMaximum)
            {
                switch (name.PublicKeyToken)
                {
                case PublicKeyTokenSilverlight:
                    switch (name.Name)
                    {
                    case "System":
                    case "System.Core":
                        return(PublicKeyTokenEcma);
                    }
                    if (name.Retargetable.GetValueOrDefault())
                    {
                        switch (name.Name)
                        {
                        case "System.Runtime.Serialization":
                        case "System.Xml":
                            return(PublicKeyTokenEcma);

                        case "System.Net":
                        case "System.Windows":
                            return(PublicKeyTokenMicrosoft);

                        case "System.ServiceModel.Web":
                            return(PublicKeyTokenWinFX);
                        }
                    }
                    break;

                case PublicKeyTokenWinFX:
                    switch (name.Name)
                    {
                    case "System.ComponentModel.Composition":
                        return(PublicKeyTokenEcma);
                    }
                    if (name.Retargetable.GetValueOrDefault())
                    {
                        switch (name.Name)
                        {
                        case "Microsoft.CSharp":
                            return(PublicKeyTokenMicrosoft);

                        case "System.Numerics":
                        case "System.ServiceModel":
                        case "System.Xml.Serialization":
                        case "System.Xml.Linq":
                            return(PublicKeyTokenEcma);
                        }
                    }
                    break;
                }
            }
            return(null);
        }
        internal static ParseAssemblyResult ParseAssemblyName(string fullName, out ParsedAssemblyName parsedName)
        {
            parsedName = new ParsedAssemblyName();
            int pos;
            ParseAssemblyResult res = ParseAssemblySimpleName(fullName, out pos, out parsedName.Name);

            if (res != ParseAssemblyResult.OK)
            {
                return(res);
            }
            else
            {
                const int ERROR_SXS_IDENTITIES_DIFFERENT = unchecked ((int)0x80073716);
                System.Collections.Generic.Dictionary <string, string> unknownAttributes = null;
                bool   hasProcessorArchitecture = false;
                bool   hasContentType           = false;
                bool   hasPublicKeyToken        = false;
                string publicKeyToken;
                while (pos != fullName.Length)
                {
                    string key   = null;
                    string value = null;
                    if (!TryParseAssemblyAttribute(fullName, ref pos, ref key, ref value))
                    {
                        return(ParseAssemblyResult.GenericError);
                    }
                    key = key.ToLowerInvariant();
                    switch (key)
                    {
                    case "version":
                        if (parsedName.Version != null)
                        {
                            return(ParseAssemblyResult.DuplicateKey);
                        }
                        parsedName.Version = value;
                        break;

                    case "culture":
                        if (parsedName.Culture != null)
                        {
                            return(ParseAssemblyResult.DuplicateKey);
                        }
                        if (!ParseCulture(value, out parsedName.Culture))
                        {
                            return(ParseAssemblyResult.GenericError);
                        }
                        break;

                    case "publickeytoken":
                        if (hasPublicKeyToken)
                        {
                            return(ParseAssemblyResult.DuplicateKey);
                        }
                        if (!ParsePublicKeyToken(value, out publicKeyToken))
                        {
                            return(ParseAssemblyResult.GenericError);
                        }
                        if (parsedName.HasPublicKey && parsedName.PublicKeyToken != publicKeyToken)
                        {
                            Marshal.ThrowExceptionForHR(ERROR_SXS_IDENTITIES_DIFFERENT);
                        }
                        parsedName.PublicKeyToken = publicKeyToken;
                        hasPublicKeyToken         = true;
                        break;

                    case "publickey":
                        if (parsedName.HasPublicKey)
                        {
                            return(ParseAssemblyResult.DuplicateKey);
                        }
                        if (!ParsePublicKey(value, out publicKeyToken))
                        {
                            return(ParseAssemblyResult.GenericError);
                        }
                        if (hasPublicKeyToken && parsedName.PublicKeyToken != publicKeyToken)
                        {
                            Marshal.ThrowExceptionForHR(ERROR_SXS_IDENTITIES_DIFFERENT);
                        }
                        parsedName.PublicKeyToken = publicKeyToken;
                        parsedName.HasPublicKey   = true;
                        break;

                    case "retargetable":
                        if (parsedName.Retargetable.HasValue)
                        {
                            return(ParseAssemblyResult.DuplicateKey);
                        }
                        switch (value.ToLowerInvariant())
                        {
                        case "yes":
                            parsedName.Retargetable = true;
                            break;

                        case "no":
                            parsedName.Retargetable = false;
                            break;

                        default:
                            return(ParseAssemblyResult.GenericError);
                        }
                        break;

                    case "processorarchitecture":
                        if (hasProcessorArchitecture)
                        {
                            return(ParseAssemblyResult.DuplicateKey);
                        }
                        hasProcessorArchitecture = true;
                        switch (value.ToLowerInvariant())
                        {
                        case "none":
                            parsedName.ProcessorArchitecture = ProcessorArchitecture.None;
                            break;

                        case "msil":
                            parsedName.ProcessorArchitecture = ProcessorArchitecture.MSIL;
                            break;

                        case "x86":
                            parsedName.ProcessorArchitecture = ProcessorArchitecture.X86;
                            break;

                        case "ia64":
                            parsedName.ProcessorArchitecture = ProcessorArchitecture.IA64;
                            break;

                        case "amd64":
                            parsedName.ProcessorArchitecture = ProcessorArchitecture.Amd64;
                            break;

                        case "arm":
                            parsedName.ProcessorArchitecture = ProcessorArchitecture.Arm;
                            break;

                        default:
                            return(ParseAssemblyResult.GenericError);
                        }
                        break;

                    case "contenttype":
                        if (hasContentType)
                        {
                            return(ParseAssemblyResult.DuplicateKey);
                        }
                        hasContentType = true;
                        if (!value.Equals("windowsruntime", StringComparison.OrdinalIgnoreCase))
                        {
                            return(ParseAssemblyResult.GenericError);
                        }
                        parsedName.WindowsRuntime = true;
                        break;

                    default:
                        if (key.Length == 0)
                        {
                            return(ParseAssemblyResult.GenericError);
                        }
                        if (unknownAttributes == null)
                        {
                            unknownAttributes = new System.Collections.Generic.Dictionary <string, string>();
                        }
                        if (unknownAttributes.ContainsKey(key))
                        {
                            return(ParseAssemblyResult.DuplicateKey);
                        }
                        unknownAttributes.Add(key, null);
                        break;
                    }
                }
                return(ParseAssemblyResult.OK);
            }
        }
        static bool IsFrameworkAssembly(ParsedAssemblyName name)
        {
            // Framework assemblies use different unification rules, so when
            // a new framework is released the new assemblies need to be added.
            switch (name.Name)
            {
            case "System":
            case "System.Core":
            case "System.Data":
            case "System.Data.DataSetExtensions":
            case "System.Data.Linq":
            case "System.Data.OracleClient":
            case "System.Data.Services":
            case "System.Data.Services.Client":
            case "System.IdentityModel":
            case "System.IdentityModel.Selectors":
            case "System.IO.Compression":
            case "System.Numerics":
            case "System.Reflection.Context":
            case "System.Runtime.Remoting":
            case "System.Runtime.Serialization":
            case "System.Runtime.WindowsRuntime":
            case "System.Runtime.WindowsRuntime.UI.Xaml":
            case "System.ServiceModel":
            case "System.Transactions":
            case "System.Windows.Forms":
            case "System.Xml":
            case "System.Xml.Linq":
            case "System.Xml.Serialization":
                return(name.PublicKeyToken == PublicKeyTokenEcma);

            case "Microsoft.CSharp":
            case "Microsoft.VisualBasic":
            case "System.Collections":
            case "System.Collections.Concurrent":
            case "System.ComponentModel":
            case "System.ComponentModel.Annotations":
            case "System.ComponentModel.EventBasedAsync":
            case "System.Configuration":
            case "System.Configuration.Install":
            case "System.Design":
            case "System.Diagnostics.Contracts":
            case "System.Diagnostics.Debug":
            case "System.Diagnostics.Tools":
            case "System.Diagnostics.Tracing":
            case "System.DirectoryServices":
            case "System.Drawing":
            case "System.Drawing.Design":
            case "System.Dynamic.Runtime":
            case "System.EnterpriseServices":
            case "System.Globalization":
            case "System.IO":
            case "System.Linq":
            case "System.Linq.Expressions":
            case "System.Linq.Parallel":
            case "System.Linq.Queryable":
            case "System.Management":
            case "System.Messaging":
            case "System.Net":
            case "System.Net.Http":
            case "System.Net.Http.Rtc":
            case "System.Net.NetworkInformation":
            case "System.Net.Primitives":
            case "System.Net.Requests":
            case "System.ObjectModel":
            case "System.Reflection":
            case "System.Reflection.Extensions":
            case "System.Reflection.Primitives":
            case "System.Resources.ResourceManager":
            case "System.Runtime":
            case "System.Runtime.Extensions":
            case "System.Runtime.InteropServices":
            case "System.Runtime.InteropServices.WindowsRuntime":
            case "System.Runtime.Numerics":
            case "System.Runtime.Serialization.Formatters.Soap":
            case "System.Runtime.Serialization.Json":
            case "System.Runtime.Serialization.Primitives":
            case "System.Runtime.Serialization.Xml":
            case "System.Security":
            case "System.Security.Principal":
            case "System.ServiceModel.Duplex":
            case "System.ServiceModel.Http":
            case "System.ServiceModel.NetTcp":
            case "System.ServiceModel.Primitives":
            case "System.ServiceModel.Security":
            case "System.ServiceProcess":
            case "System.Text.Encoding":
            case "System.Text.Encoding.Extensions":
            case "System.Text.RegularExpressions":
            case "System.Threading":
            case "System.Threading.Tasks":
            case "System.Threading.Tasks.Parallel":
            case "System.Web":
            case "System.Web.Mobile":
            case "System.Web.Services":
            case "System.Windows":
            case "System.Xml.ReaderWriter":
            case "System.Xml.XDocument":
            case "System.Xml.XmlSerializer":
                return(name.PublicKeyToken == PublicKeyTokenMicrosoft);

            case "System.ComponentModel.DataAnnotations":
            case "System.ServiceModel.Web":
            case "System.Web.Abstractions":
            case "System.Web.Extensions":
            case "System.Web.Extensions.Design":
            case "System.Web.DynamicData":
            case "System.Web.Routing":
                return(name.PublicKeyToken == PublicKeyTokenWinFX);
            }

            return(false);
        }