X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Reflection%2FAssemblyName.cs;h=9da34563f241ccf3e575df1e5acc425dfae28f90;hb=ac194553049b2eeb328f5fc54b708da9b95f4d88;hp=8e96227d2d292eda1c4e7a36b07fac64f2699cf3;hpb=15af51806d816ad6ad966bc1dfbdd232b63fde52;p=mono.git diff --git a/mcs/class/corlib/System.Reflection/AssemblyName.cs b/mcs/class/corlib/System.Reflection/AssemblyName.cs index 8e96227d2d2..9da34563f24 100644 --- a/mcs/class/corlib/System.Reflection/AssemblyName.cs +++ b/mcs/class/corlib/System.Reflection/AssemblyName.cs @@ -54,8 +54,11 @@ namespace System.Reflection { [Serializable] [ClassInterfaceAttribute (ClassInterfaceType.None)] [StructLayout (LayoutKind.Sequential)] +#if MOBILE + public sealed class AssemblyName : ICloneable, ISerializable, IDeserializationCallback { +#else public sealed class AssemblyName : ICloneable, ISerializable, IDeserializationCallback, _AssemblyName { - +#endif #pragma warning disable 169 #region Synch with object-internals.h string name; @@ -72,7 +75,8 @@ namespace System.Reflection { ProcessorArchitecture processor_architecture = ProcessorArchitecture.None; #endregion #pragma warning restore 169 - + + AssemblyContentType contentType; public AssemblyName () { // defaults @@ -232,18 +236,17 @@ namespace System.Reflection { { if (keyToken != null) return keyToken; - else if (publicKey == null) + if (publicKey == null) return null; - else { + if (publicKey.Length == 0) - return new byte [0]; + return EmptyArray.Value; if (!IsPublicKeyValid) throw new SecurityException ("The public key is not valid."); keyToken = ComputePublicKeyToken (); return keyToken; - } } private bool IsPublicKeyValid { @@ -261,21 +264,29 @@ namespace System.Reflection { switch (publicKey [0]) { case 0x00: // public key inside a header if (publicKey.Length > 12 && publicKey [12] == 0x06) { +#if MOBILE + return true; +#else try { CryptoConvert.FromCapiPublicKeyBlob ( publicKey, 12); return true; } catch (CryptographicException) { } +#endif } break; case 0x06: // public key +#if MOBILE + return true; +#else try { CryptoConvert.FromCapiPublicKeyBlob (publicKey); return true; } catch (CryptographicException) { } - break; + break; +#endif case 0x07: // private key break; } @@ -293,7 +304,7 @@ namespace System.Reflection { return null; if (publicKey.Length == 0) - return new byte [0]; + return EmptyArray.Value; if (!IsPublicKeyValid) throw new SecurityException ("The public key is not valid."); @@ -301,27 +312,28 @@ namespace System.Reflection { return ComputePublicKeyToken (); } - private byte [] ComputePublicKeyToken () + [MethodImplAttribute (MethodImplOptions.InternalCall)] + extern unsafe static void get_public_token (byte* token, byte* pubkey, int len); + + private unsafe byte [] ComputePublicKeyToken () { - HashAlgorithm ha = SHA1.Create (); - byte [] hash = ha.ComputeHash (publicKey); - // we need the last 8 bytes in reverse order byte [] token = new byte [8]; - Array.Copy (hash, (hash.Length - 8), token, 0, 8); - Array.Reverse (token, 0, 8); + fixed (byte* pkt = token) + fixed (byte *pk = publicKey) + get_public_token (pkt, pk, publicKey.Length); return token; } - [MonoTODO] public static bool ReferenceMatchesDefinition (AssemblyName reference, AssemblyName definition) { if (reference == null) throw new ArgumentNullException ("reference"); if (definition == null) throw new ArgumentNullException ("definition"); - if (reference.Name != definition.Name) - return false; - throw new NotImplementedException (); + + // we only compare the simple assembly name to be consistent with MS .NET, + // which is the result of a bug in their implementation (see https://connect.microsoft.com/VisualStudio/feedback/details/752902) + return string.Equals (reference.Name, definition.Name, StringComparison.OrdinalIgnoreCase); } public void SetPublicKey (byte[] publicKey) @@ -375,6 +387,7 @@ namespace System.Reflection { an.publicKey = publicKey; an.keyToken = keyToken; an.versioncompat = versioncompat; + an.processor_architecture = processor_architecture; return an; } @@ -393,6 +406,7 @@ namespace System.Reflection { return aname; } +#if !MOBILE void _AssemblyName.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId) { throw new NotImplementedException (); @@ -413,5 +427,22 @@ namespace System.Reflection { { throw new NotImplementedException (); } +#endif + + public string CultureName { + get { + return (cultureinfo == null)? null : cultureinfo.Name; + } + } + + [ComVisibleAttribute(false)] + public AssemblyContentType ContentType { + get { + return contentType; + } + set { + contentType = value; + } + } } }