File: System\Addin\MiniReflection\MetadataReader\AssemblyInfo.cs
Project: ndp\fx\src\AddIn\AddIn\System.AddIn.csproj (System.AddIn)
using System;
 
namespace System.AddIn.MiniReflection.MetadataReader
{
    internal struct AssemblyInfo
    {
        private Version m_Version;
        private UInt32 m_Flags;
        private String m_SimpleName;
        private String m_Culture;          // Never an empty string, always null for non-empty
        private byte[] m_PublicKey;
        private String m_FullName;
        private String m_PublicKeyToken;
 
        /*
        public String SimpleName
        {
            get { return m_SimpleName; }
        }
 
        public String Culture
        {
            get { return m_Culture; }
        }
         */
 
        public AssemblyInfo(System.Reflection.AssemblyName AN)
        {
            m_Version = AN.Version;
            m_Flags = (UInt32) AN.Flags;
            byte[] Token;
            if ((m_Flags & (UInt32) System.Reflection.AssemblyNameFlags.PublicKey) == 0)
                Token = AN.GetPublicKeyToken();
            else Token = AN.GetPublicKey();
            if ((Token != null) && (Token.Length==0))
                m_PublicKey = null;
            else m_PublicKey = Token;
            m_SimpleName = AN.Name;
            m_Culture = AN.CultureInfo.Name;
            if (m_Culture.Length == 0) m_Culture = null;
            m_FullName = null;
            m_PublicKeyToken = null;
        }
 
        internal AssemblyInfo(Version V, UInt32 Flags, byte[] PublicKeyOrToken, 
                              String Name, String Culture)
        {
            m_Version = V;
            m_Flags = Flags;
            m_PublicKey = PublicKeyOrToken;
            m_SimpleName = Name;
            m_Culture = Culture;
            m_FullName = null;
            m_PublicKeyToken = null;
        }
        
        public static implicit operator AssemblyInfo(System.Reflection.AssemblyName AN)
        {
            return new AssemblyInfo(AN);
        }
 
        public String PublicKeyToken
        {
            get
            {
                if (m_PublicKeyToken == null)
                {
                    if (m_PublicKey == null) return null;
                    byte[] Useful = new byte[8];
                    if ((m_Flags & (UInt32) System.Reflection.AssemblyNameFlags.PublicKey) != 0)
                    {
                        using (System.Security.Cryptography.SHA1 Hasher = System.Security.Cryptography.SHA1.Create()) {
                            byte[] Hashed = Hasher.ComputeHash(m_PublicKey);
                            for (int i = 0, j = Hashed.Length - 1; i < 8; i++, j--)
                                Useful[i] = Hashed[j];
                        }
                    }
                    else 
                        Useful = m_PublicKey;
                    m_PublicKeyToken = PEFileReader.BytesToHexString(Useful);
                }
                return m_PublicKeyToken;
            }
        }
 
        /*
        public System.Reflection.ProcessorArchitecture ProcessorArchitecture
        {
            get
            { // According to inc\corhdr.h the architecture is encoded in the flags,
                // as xxxxxxPx where P is a byte of the form 0yyy with yyy being the value
                // we want to return.
                return (System.Reflection.ProcessorArchitecture)((m_Flags & 0x70) >> 4);
            }
        }
 
        public static AssemblyInfo[] FromArray(System.Reflection.AssemblyName[] ANs)
        {
            AssemblyInfo[] Result = new AssemblyInfo[ANs.Length];
            for (int i = 0; i < ANs.Length; i++) Result[i] = new AssemblyInfo(ANs[i]);
            return Result;
        }
         */
 
        public Version Version
        {
            get { return m_Version; }
        }
 
        public override String ToString()
        {
            if (m_FullName == null)
            {
                m_FullName = m_SimpleName + ", Version=" + Version.Major + "." +
                             Version.Minor + "." + Version.Build + "." + Version.Revision;
                m_FullName += ", Culture=" + ((m_Culture == null) ? "neutral" : m_Culture);
                String PKT = PublicKeyToken;
                m_FullName += ", PublicKeyToken=" + ((PKT == null) ? "null" : PKT);
            }
            return m_FullName;
        }
 
        /*
        public String FullName
        {
            // Note: always returns PublicKeyToken, never full public key
            get
            {
                return this.ToString();
            }
        }
         */
    }
}