assemblyname.cs
来自「没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没的 没」· CS 代码 · 共 469 行
CS
469 行
/* * AssemblyName.cs - Implementation of the * "System.Reflection.AssemblyName" class. * * Copyright (C) 2001, 2003 Southern Storm Software, Pty Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */namespace System.Reflection{#if !ECMA_COMPATusing System;using System.IO;using System.Text;using System.Globalization;using System.Runtime.CompilerServices;using System.Runtime.Serialization;using System.Configuration.Assemblies;using System.Security.Cryptography;public sealed class AssemblyName : ICloneable#if CONFIG_SERIALIZATION , ISerializable, IDeserializationCallback#endif{ // Internal state. private String codeBase; private CultureInfo culture; private AssemblyNameFlags flags; private String name; private AssemblyHashAlgorithm hashAlg; private StrongNameKeyPair keyPair; private Version version; private AssemblyVersionCompatibility versionCompat; private byte[] publicKey; private byte[] publicKeyToken;#if CONFIG_SERIALIZATION private SerializationInfo info;#endif // Constructor. public AssemblyName() { versionCompat = AssemblyVersionCompatibility.SameMachine; }#if CONFIG_SERIALIZATION internal AssemblyName(SerializationInfo info, StreamingContext context) { this.info = info; }#endif private AssemblyName(AssemblyName other) { codeBase = other.codeBase; culture = other.culture; flags = other.flags; name = other.name; hashAlg = other.hashAlg; keyPair = other.keyPair; version = (version == null ? null : (Version)(other.version.Clone())); versionCompat = other.versionCompat; publicKey = (other.publicKey == null ? null : (byte[])(other.publicKey.Clone())); publicKeyToken = (other.publicKeyToken == null ? null : (byte[])(other.publicKeyToken.Clone())); } // Fill assembly name information from a file. Returns a load error code. [MethodImpl(MethodImplOptions.InternalCall)] extern private static int FillAssemblyNameFromFile (AssemblyName nameInfo, String assemblyFile, Assembly caller); // Get the assembly name for a specific file. public static AssemblyName GetAssemblyName(String assemblyFile) { if(assemblyFile == null) { throw new ArgumentNullException("assemblyFile"); } assemblyFile = Path.GetFullPath(assemblyFile); AssemblyName nameInfo = new AssemblyName(); if(assemblyFile[0] == '/' || assemblyFile[0] == '\\') { nameInfo.CodeBase = "file://" + assemblyFile.Replace('\\', '/'); } else { nameInfo.CodeBase = "file:///" + assemblyFile.Replace('\\', '/'); } int error = FillAssemblyNameFromFile (nameInfo, assemblyFile, Assembly.GetCallingAssembly()); if(error != Assembly.LoadError_OK) { Assembly.ThrowLoadError(assemblyFile, error); } return nameInfo; } // Get or set the code base for the assembly name. public String CodeBase { get { return codeBase; } set { codeBase = value; } } // Get or set the culture associated with the assembly name. public CultureInfo CultureInfo { get { return culture; } set { culture = value; } } // Get the escaped code base for the assembly name. public String EscapedCodeBase { get { if(codeBase == null) { return null; } StringBuilder builder = new StringBuilder(); foreach(char ch in codeBase) { if(ch == ' ' || ch == '%') { builder.Append(String.Format("%{0:x2}", (int)ch)); } else { builder.Append(ch); } } return builder.ToString(); } } // Get or set the assembly name flags. public AssemblyNameFlags Flags { get { return flags; } set { flags = value; } } // Get the full name of the assembly. public String FullName { get { if(name == null) { return null; } StringBuilder builder = new StringBuilder(); builder.Append(name); builder.Append(", Version="); if(version != null) { builder.Append(version.ToString()); } else { builder.Append("0.0.0.0"); } builder.Append(", Culture="); if(culture != null && culture.LCID != 0x007F) { builder.Append(culture.Name); } else { builder.Append("neutral"); } byte[] token = GetPublicKeyToken(); builder.Append(", PublicKeyToken="); if(token != null) { foreach(byte b in token) { builder.Append(String.Format("{0:x2}", (int)b)); } } else { builder.Append("null"); } return builder.ToString(); } } // Get or set the hash algorithm for this assembly name. public AssemblyHashAlgorithm HashAlgorithm { get { return hashAlg; } set { hashAlg = value; } } // Get or set the key pair for this assembly name. public StrongNameKeyPair KeyPair { get { return keyPair; } set { keyPair = value; } } // Get or set the simple name of the assembly name. public String Name { get { return name; } set { name = value; } } // Get or set the version information of the assembly name. public Version Version { get { return version; } set { version = value; } } // Get or set the version compatibility value for the assembly name. public AssemblyVersionCompatibility VersionCompatibility { get { return versionCompat; } set { versionCompat = value; } } // Clone this object. public Object Clone() { return new AssemblyName(this); } // Get the public key for the assembly's originator. public byte[] GetPublicKey() { return publicKey; } // Set the public key for the assembly's originator. public void SetPublicKey(byte[] publicKey) { this.publicKey = publicKey; this.flags |= AssemblyNameFlags.PublicKey; } // Get the public key token for the assembly's originator. public byte[] GetPublicKeyToken() { #if CONFIG_CRYPTO if(publicKeyToken == null && publicKey != null) { // The public key token is the reverse of the last // eight bytes of the SHA1 hash of the public key. SHA1CryptoServiceProvider sha1; sha1 = new SHA1CryptoServiceProvider(); byte[] hash = sha1.ComputeHash(publicKey); ((IDisposable)sha1).Dispose(); publicKeyToken = new byte [8]; int posn; for(posn = 0; posn < 8; ++posn) { publicKeyToken[posn] = hash[hash.Length - 1 - posn]; } } #endif return publicKeyToken; } // Set the public key token for the assembly's originator. public void SetPublicKeyToken(byte[] publicKeyToken) { this.publicKeyToken = publicKeyToken; } // Convert this assembly name into a string. public override String ToString() { String name = FullName; if(name != null) { return name; } return base.ToString(); } // Set the culture by name. internal void SetCultureByName(String name) { if(name == null || name.Length == 0 || name == "iv") { culture = null; } else { try { culture = new CultureInfo(name); } catch(Exception) { // The culture name was probably not understood. culture = null; } } } // Set the version information by number. internal void SetVersion(int major, int minor, int build, int revision) { version = new Version(major, minor, build, revision); } static internal AssemblyName Parse(String assemblyName) { AssemblyName retval = new AssemblyName(); if(assemblyName.IndexOf(",") == -1) { retval.Name = assemblyName; } else { // TODO : Parse the rest of the information // as well. Version maybe important . retval.Name = assemblyName.Substring(0, assemblyName.IndexOf(",")); } return retval; }#if CONFIG_SERIALIZATION // Get the serialization data for this object. public void GetObjectData(SerializationInfo info, StreamingContext context) { if(info == null) { throw new ArgumentNullException("info"); } info.AddValue("_Name", name); info.AddValue("_PublicKey", publicKey, typeof(byte[])); info.AddValue("_PublicKeyToken", publicKeyToken, typeof(byte[])); if(culture == null) { info.AddValue("_CultureInfo", -1); } else { info.AddValue("_CultureInfo", culture.LCID); } info.AddValue("_CodeBase", codeBase); info.AddValue("_Version", version, typeof(Version)); info.AddValue("_HashAlgorithm", hashAlg, typeof(AssemblyHashAlgorithm)); info.AddValue("_StrongNameKeyPair", keyPair, typeof(StrongNameKeyPair)); info.AddValue("_VersionCompatibility", versionCompat, typeof(AssemblyVersionCompatibility)); info.AddValue("_Flags", flags, typeof(AssemblyNameFlags)); } // Handle a deserialization callback on this object. public void OnDeserialization(Object sender) { if(info == null) { return; } name = info.GetString("_Name"); publicKey = (byte[])(info.GetValue ("_PublicKey", typeof(byte[]))); publicKeyToken = (byte[])(info.GetValue ("_PublicKeyToken", typeof(byte[]))); int cultureID = info.GetInt32("_CultureInfo"); if(cultureID != -1) { culture = new CultureInfo(cultureID); } else { culture = null; } codeBase = info.GetString("_CodeBase"); version = (Version)(info.GetValue("_Version", typeof(Version))); hashAlg = (AssemblyHashAlgorithm)(info.GetValue ("_HashAlgorithm", typeof(AssemblyHashAlgorithm))); keyPair = (StrongNameKeyPair)(info.GetValue ("_StrongNameKeyPair", typeof(StrongNameKeyPair))); versionCompat = (AssemblyVersionCompatibility)(info.GetValue ("_VersionCompatibility", typeof(AssemblyVersionCompatibility))); flags = (AssemblyNameFlags)(info.GetValue ("_Flags", typeof(AssemblyNameFlags))); }#endif // CONFIG_SERIALIZATION}; // class AssemblyName#endif // !ECMA_COMPAT}; // namespace System.Reflection
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?