Mark tests as not working under TARGET_JVM
[mono.git] / mcs / class / System.Web / System.Web.Configuration_2.0 / ProvidersHelper.cs
index 46a88eb1fef26d48f0b12c7f2e0df60fcccba413..8b729bd9e21423f1aba55e249052405507bc6b38 100644 (file)
 #if NET_2_0
 
 using System;
+using System.Collections;
 using System.Configuration;
 using System.Configuration.Provider;
 using System.Data.Common;
 using System.Data.SqlClient;
+using System.IO;
+using System.Reflection;
+using System.Web.Compilation;
 
 namespace System.Web.Configuration {
 
        public static class ProvidersHelper
        {
+               private static string privateBinPath = null;
+               
                public static ProviderBase InstantiateProvider (ProviderSettings providerSettings, Type providerType)
                {
                        Type settingsType = Type.GetType (providerSettings.Type);
+                       if (settingsType == null && Directory.Exists (PrivateBinPath)) {
+                               string [] binDlls = Directory.GetFiles (PrivateBinPath, "*.dll");
+                               foreach (string s in binDlls) {
+                                       Assembly binA = Assembly.LoadFrom (s);
+                                       settingsType = binA.GetType (providerSettings.Type);
+                                       if (settingsType != null)
+                                               break;
+                               }
+                       }
+
+                       // check App_Code dlls
+                       if (settingsType == null) {
+                               IList appCode = BuildManager.CodeAssemblies;
+
+                               if (appCode != null && appCode.Count > 0) {
+                                       Assembly asm;
+                                       foreach (object o in appCode) {
+                                               asm = o as Assembly;
+                                               if (asm == null)
+                                                       continue;
+                                               settingsType = asm.GetType (providerSettings.Type);
+                                               if (settingsType != null)
+                                                       break;
+                                       }
+                               }
+                       }
 
                        if (settingsType == null)
-                               throw new ConfigurationErrorsException (String.Format ("Could not find type: {0}", providerSettings.Type));
+                               throw new ConfigurationErrorsException (String.Format ("Could not find type: {0}",
+                                                                                      providerSettings.Type));
                        if (!providerType.IsAssignableFrom (settingsType))
-                               throw new ConfigurationErrorsException (String.Format ("Provider '{0}' must subclass from '{1}'", providerSettings.Name, providerType));
+                               throw new ConfigurationErrorsException (String.Format ("Provider '{0}' must subclass from '{1}'",
+                                                                                      providerSettings.Name, providerType));
 
                        ProviderBase provider = Activator.CreateInstance (settingsType) as ProviderBase;
 
@@ -55,6 +89,18 @@ namespace System.Web.Configuration {
                        return provider;
                }
 
+               private static string PrivateBinPath {
+                       get {
+                               if (privateBinPath != null)
+                                       return privateBinPath;
+
+                               AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
+                               privateBinPath = Path.Combine (setup.ApplicationBase, setup.PrivateBinPath);
+
+                               return privateBinPath;
+                       }
+               }
+
                public static void InstantiateProviders (ProviderSettingsCollection configProviders, ProviderCollection providers, Type providerType)
                {
                        if (!typeof (ProviderBase).IsAssignableFrom (providerType))