[corlib] Update public api
[mono.git] / mcs / class / corlib / System.Reflection / Assembly.cs
index c3bb5a3fbf10cd6c2983d638f4e374d6bec8f2ed..0bba65f4693a630934df471360618a9d26b4b2f7 100644 (file)
@@ -39,6 +39,9 @@ using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 using System.Collections.Generic;
 using System.Configuration.Assemblies;
+using System.Threading;
+using System.Text;
+using System.Diagnostics.Contracts;
 
 using Mono.Security;
 
@@ -70,7 +73,7 @@ namespace System.Reflection {
 
                        protected override void Dispose (bool disposing)
                        {
-                               if (!closed) {
+                               if (_isOpen) {
                                        /* 
                                         * The returned pointer points inside metadata, so
                                         * we have to increase the refcount of the module, and decrease
@@ -337,19 +340,58 @@ namespace System.Reflection {
 
                public virtual Stream GetManifestResourceStream (Type type, String name)
                {
-                       string ns;
-                       if (type != null) {
-                               ns = type.Namespace;
-                       } else {
+                       StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+                       return GetManifestResourceStream(type, name, false, ref stackMark);
+               }
+
+               internal Stream GetManifestResourceStream (Type type, String name, bool skipSecurityCheck, ref StackCrawlMark stackMark)
+               {
+                       StringBuilder sb = new StringBuilder ();
+                       if (type == null) {
                                if (name == null)
-                                       throw new ArgumentNullException ("type");
-                               ns = null;
+                                               throw new ArgumentNullException ("type");
+                       } else {
+                               String nameSpace = type.Namespace;
+                               if (nameSpace != null) {
+                                       sb.Append (nameSpace);
+                                       if (name != null)
+                                               sb.Append (Type.Delimiter);
+                               }
                        }
 
-                       if (ns == null || ns.Length == 0)
-                               return GetManifestResourceStream (name);
-                       else
-                               return GetManifestResourceStream (ns + "." + name);
+                       if (name != null)
+                               sb.Append(name);
+
+                       return GetManifestResourceStream (sb.ToString());
+               }
+
+               internal unsafe Stream GetManifestResourceStream(String name, ref StackCrawlMark stackMark, bool skipSecurityCheck)
+               {
+                       return GetManifestResourceStream (null, name, skipSecurityCheck, ref stackMark);
+               }
+
+               internal String GetSimpleName()
+               {
+                       AssemblyName aname = GetName (true);
+                       return aname.Name;
+               }
+
+               internal byte[] GetPublicKey()
+               {
+                       AssemblyName aname = GetName (true);
+                       return aname.GetPublicKey ();
+               }
+
+               internal Version GetVersion()
+               {
+                       AssemblyName aname = GetName (true);
+                       return aname.Version;
+               }
+
+               private AssemblyNameFlags GetFlags()
+               {
+                       AssemblyName aname = GetName (true);
+                       return aname.Flags;
                }
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
@@ -435,40 +477,53 @@ namespace System.Reflection {
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                public static extern Assembly GetEntryAssembly();
 
-               internal Assembly GetSatelliteAssemblyNoThrow (CultureInfo culture, Version version)
+               internal Assembly GetSatelliteAssembly (CultureInfo culture, Version version, bool throwOnError)
                {
-                       return GetSatelliteAssembly (culture, version, false);
+                       if (culture == null)
+                               throw new ArgumentNullException("culture");
+                       Contract.EndContractBlock();
+
+                       StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+                       String name = GetSimpleName() + ".resources";
+                       return InternalGetSatelliteAssembly(name, culture, version, true, ref stackMark);
                }
 
-               internal Assembly GetSatelliteAssembly (CultureInfo culture, Version version, bool throwOnError)
+               internal RuntimeAssembly InternalGetSatelliteAssembly (String name, CultureInfo culture, Version version, bool throwOnFileNotFound, ref StackCrawlMark stackMark)
                {
-                       if (culture == null)
-                               throw new ArgumentException ("culture");
+                       AssemblyName an = new AssemblyName ();
 
-                       AssemblyName aname = GetName (true);
-                       if (version != null)
-                               aname.Version = version;
+                       an.SetPublicKey (GetPublicKey ());
+                       an.Flags = GetFlags () | AssemblyNameFlags.PublicKey;
+
+                       if (version == null)
+                               an.Version = GetVersion ();
+                       else
+                               an.Version = version;
+
+                       an.CultureInfo = culture;
+                       an.Name = name;
 
-                       aname.CultureInfo = culture;
-                       aname.Name = aname.Name + ".resources";
                        Assembly assembly;
 
                        try {
-                               assembly = AppDomain.CurrentDomain.LoadSatellite (aname, false);
+                               assembly = AppDomain.CurrentDomain.LoadSatellite (an, false);
                                if (assembly != null)
-                                       return assembly;
+                                       return (RuntimeAssembly)assembly;
                        } catch (FileNotFoundException) {
                                assembly = null;
                                // ignore
                        }
 
+                       if (String.IsNullOrEmpty (Location))
+                               return null;
+
                        // Try the assembly directory
                        string location = Path.GetDirectoryName (Location);
-                       string fullName = Path.Combine (location, Path.Combine (culture.Name, aname.Name + ".dll"));
-                       if (!throwOnError && !File.Exists (fullName))
+                       string fullName = Path.Combine (location, Path.Combine (culture.Name, an.Name + ".dll"));
+                       if (!throwOnFileNotFound && !File.Exists (fullName))
                                return null;
 
-                       return LoadFrom (fullName);
+                       return (RuntimeAssembly)LoadFrom (fullName);
                }
 
 #if !MOBILE
@@ -716,7 +771,7 @@ namespace System.Reflection {
                                throw new ArgumentNullException ("resourceName");
                        if (resourceName.Length == 0)
                                throw new ArgumentException ("String cannot have zero length.");
-                       ManifestResourceInfo result = new ManifestResourceInfo ();
+                       ManifestResourceInfo result = new ManifestResourceInfo (null, null, 0);
                        bool found = GetManifestResourceInfoInternal (resourceName, result);
                        if (found)
                                return result;