[ComDefaultInterfaceAttribute (typeof (_AssemblyName))]
[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;
ProcessorArchitecture processor_architecture = ProcessorArchitecture.None;
#endregion
#pragma warning restore 169
-
+
+#if NET_4_5
+ AssemblyContentType contentType;
+#endif
public AssemblyName ()
{
// defaults
if (name == null)
return string.Empty;
StringBuilder fname = new StringBuilder ();
- fname.Append (name);
+ if (Char.IsWhiteSpace (name [0]))
+ fname.Append ("\"" + name + "\"");
+ else
+ fname.Append (name);
if (Version != null) {
fname.Append (", Version=");
fname.Append (Version.ToString ());
{
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<byte>.Value;
if (!IsPublicKeyValid)
throw new SecurityException ("The public key is not valid.");
keyToken = ComputePublicKeyToken ();
return keyToken;
- }
}
private bool IsPublicKeyValid {
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;
}
return null;
if (publicKey.Length == 0)
- return new byte [0];
+ return EmptyArray<byte>.Value;
if (!IsPublicKeyValid)
throw new SecurityException ("The public key is not valid.");
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)
an.publicKey = publicKey;
an.keyToken = keyToken;
an.versioncompat = versioncompat;
+ an.processor_architecture = processor_architecture;
return an;
}
return aname;
}
-#if NET_1_1
+#if !MOBILE
void _AssemblyName.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
{
throw new NotImplementedException ();
throw new NotImplementedException ();
}
#endif
+
+#if NET_4_5
+ public string CultureName {
+ get {
+ if (cultureinfo == null)
+ return null;
+ if (cultureinfo.LCID == CultureInfo.InvariantCulture.LCID)
+ return "neutral";
+ return cultureinfo.Name;
+ }
+ }
+
+ [ComVisibleAttribute(false)]
+ public AssemblyContentType ContentType {
+ get {
+ return contentType;
+ }
+ set {
+ contentType = value;
+ }
+ }
+#endif
}
}