2 // System.Reflection/AssemblyName.cs
5 // Paolo Molaro (lupus@ximian.com)
6 // Sebastien Pouliot (spouliot@motus.com)
8 // (C) 2001 Ximian, Inc. http://www.ximian.com
9 // Portions (C) 2002 Motus Technologies Inc. (http://www.motus.com)
13 using System.Configuration.Assemblies;
14 using System.Globalization;
15 using System.Reflection;
16 using System.Runtime.Serialization;
17 using System.Security.Cryptography;
19 using System.Runtime.InteropServices;
20 using System.Runtime.CompilerServices;
22 namespace System.Reflection {
25 // a. Uniform Resource Identifiers (URI): Generic Syntax
26 // http://www.ietf.org/rfc/rfc2396.txt
29 public sealed class AssemblyName : ICloneable, ISerializable, IDeserializationCallback {
32 int major, minor, build, revision;
33 CultureInfo cultureinfo;
34 AssemblyNameFlags flags;
35 AssemblyHashAlgorithm hashalg;
36 StrongNameKeyPair keypair;
39 AssemblyVersionCompatibility versioncompat;
41 public AssemblyName ()
44 versioncompat = AssemblyVersionCompatibility.SameMachine;
47 internal AssemblyName (SerializationInfo si, StreamingContext sc)
49 name = si.GetString ("_Name");
50 codebase = si.GetString ("_CodeBase");
51 Version = (Version)si.GetValue ("_Version", typeof (Version));
59 public string CodeBase {
60 get { return codebase; }
61 set { codebase = value; }
64 [MonoTODO("RFC 2396")]
65 private string Escape (string url)
67 // we already have code in mcs\class\System\System\Uri.cs
68 // but Uri class ins't part of corlib !
73 public string EscapedCodeBase {
74 get { return Escape (codebase); }
77 public CultureInfo CultureInfo {
78 get { return cultureinfo; }
79 set { cultureinfo = value; }
82 public AssemblyNameFlags Flags {
84 set { flags = value; }
87 [MonoTODO("incomplete")]
88 public string FullName {
92 StringBuilder fname = new StringBuilder ();
94 fname.Append (", Version=");
95 fname.Append (Version.ToString ());
96 fname.Append (", Culture=");
97 if ((cultureinfo == null) || (cultureinfo.LCID == CultureInfo.InvariantCulture.LCID))
98 fname.Append ("neutral");
100 fname.Append (cultureinfo.ToString ()); // ???
101 byte[] pub_tok = GetPublicKeyToken ();
102 if (pub_tok == null || pub_tok.Length == 0)
103 fname.Append (", PublicKeyToken=null");
105 fname.Append (", PublicKeyToken=");
106 for (int i = 0; i < pub_tok.Length; i++)
107 fname.Append (pub_tok[i].ToString ("x2"));
110 return fname.ToString ();
114 public AssemblyHashAlgorithm HashAlgorithm {
115 get { return hashalg; }
116 set { hashalg = value; }
119 public StrongNameKeyPair KeyPair {
120 get { return keypair; }
121 set { keypair = value; }
124 public Version Version {
129 return new Version (major, minor);
132 return new Version (major, minor, build);
134 return new Version (major, minor, build, revision);
141 revision = value.Revision;
145 public AssemblyVersionCompatibility VersionCompatibility {
146 get { return versioncompat; }
147 set { versioncompat = value; }
150 public override string ToString ()
152 string name = FullName;
153 return (name != null) ? name : base.ToString ();
156 public byte[] GetPublicKey()
158 // to match MS implementation -- funny one
159 if (publicKey != null)
161 else if (name == null)
167 public byte[] GetPublicKeyToken()
169 if (keyToken != null)
171 else if (publicKey == null)
174 HashAlgorithm ha = null;
176 case AssemblyHashAlgorithm.MD5:
180 // None default to SHA1
184 byte[] hash = ha.ComputeHash (publicKey);
185 // we need the last 8 bytes in reverse order
186 keyToken = new byte [8];
187 Array.Copy (hash, (hash.Length - 8), keyToken, 0, 8);
188 Array.Reverse (keyToken, 0, 8);
193 public void SetPublicKey (byte[] publicKey)
195 flags = AssemblyNameFlags.PublicKey;
196 this.publicKey = publicKey;
199 public void SetPublicKeyToken (byte[] publicKeyToken)
201 keyToken = publicKeyToken;
204 public void GetObjectData (SerializationInfo info, StreamingContext context)
206 info.AddValue ("_Name", name);
207 info.AddValue ("_CodeBase", codebase);
208 info.AddValue ("_Version", Version);
211 // required to implement ICloneable
213 public object Clone()
218 // required to implement IDeserializationCallback
220 public void OnDeserialization (object sender)
224 public static AssemblyName GetAssemblyName (string assemblyFile)
226 if (assemblyFile == null)
227 throw new ArgumentNullException ("assemblyFile");
229 AssemblyName aname = new AssemblyName ();
230 Assembly.InternalGetAssemblyName (assemblyFile, aname);