The Labs \ Source Viewer \ SSCLI \ System \ LoaderInformation

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. /*=============================================================================
  16. **
  17. ** Class: AppDomainSetup
  18. **
  19. ** Purpose: Defines the settings that the loader uses to find assemblies in an
  20. **          AppDomain
  21. **
  22. ** Date: Dec 22, 2000
  23. **
  24. =============================================================================*/
  25. namespace System
  26. {
  27.     using System;
  28.     using System.Runtime.CompilerServices;
  29.     using System.Runtime;
  30.     using System.Runtime.Hosting;
  31.     using System.Text;
  32.     using System.Threading;
  33.     using System.Runtime.InteropServices;
  34.     using System.Security;
  35.     using System.Security.Permissions;
  36.     using System.Security.Policy;
  37.     using System.Globalization;
  38.     using Path = System.IO.Path;
  39.     using System.Runtime.Versioning;
  40.    
  41.     // Only statics, does not need to be marked with the serializable attribute
  42.     [Serializable()]
  43.     [ClassInterface(ClassInterfaceType.None)]
  44.     [System.Runtime.InteropServices.ComVisible(true)]
  45.     public sealed class AppDomainSetup : IAppDomainSetup
  46.     {
  47.         [Serializable()]
  48.         internal enum LoaderInformation
  49.         {
  50.             // If you add a new value, add the corresponding property
  51.             // to AppDomain.GetData() and SetData()'s switch statements.
  52.             ApplicationBaseValue = LOADER_APPLICATION_BASE,
  53.             ConfigurationFileValue = LOADER_CONFIGURATION_BASE,
  54.             DynamicBaseValue = LOADER_DYNAMIC_BASE,
  55.             DevPathValue = LOADER_DEVPATH,
  56.             ApplicationNameValue = LOADER_APPLICATION_NAME,
  57.             PrivateBinPathValue = LOADER_PRIVATE_PATH,
  58.             PrivateBinPathProbeValue = LOADER_PRIVATE_BIN_PATH_PROBE,
  59.             ShadowCopyDirectoriesValue = LOADER_SHADOW_COPY_DIRECTORIES,
  60.             ShadowCopyFilesValue = LOADER_SHADOW_COPY_FILES,
  61.             CachePathValue = LOADER_CACHE_PATH,
  62.             LicenseFileValue = LOADER_LICENSE_FILE,
  63.             DisallowPublisherPolicyValue = LOADER_DISALLOW_PUBLISHER_POLICY,
  64.             DisallowCodeDownloadValue = LOADER_DISALLOW_CODE_DOWNLOAD,
  65.             DisallowBindingRedirectsValue = LOADER_DISALLOW_BINDING_REDIRECTS,
  66.             DisallowAppBaseProbingValue = LOADER_DISALLOW_APPBASE_PROBING,
  67.             ConfigurationBytesValue = LOADER_CONFIGURATION_BYTES,
  68.             LoaderMaximum = LOADER_MAXIMUM
  69.         }
  70.        
  71.         private string[] _Entries;
  72.         private LoaderOptimization _LoaderOptimization;
  73.         #pragma warning disable 169
  74.         private string _AppBase;
  75.         // for compat with v1.1
  76.         #pragma warning restore 169
  77.         [System.Runtime.Serialization.OptionalField(VersionAdded = 2)]
  78.         private AppDomainInitializer _AppDomainInitializer;
  79.         [System.Runtime.Serialization.OptionalField(VersionAdded = 2)]
  80.         private string[] _AppDomainInitializerArguments;
  81.         [System.Runtime.Serialization.OptionalField(VersionAdded = 2)]
  82.         private ActivationArguments _ActivationArguments;
  83.         [System.Runtime.Serialization.OptionalField(VersionAdded = 2)]
  84.         private byte[] _ConfigurationBytes;
  85.        
  86.         internal AppDomainSetup(AppDomainSetup copy, bool copyDomainBoundData)
  87.         {
  88.             string[] mine = Value;
  89.             if (copy != null) {
  90.                 string[] other = copy.Value;
  91.                 int mineSize = _Entries.Length;
  92.                 int otherSize = other.Length;
  93.                 int size = (otherSize < mineSize) ? otherSize : mineSize;
  94.                
  95.                 for (int i = 0; i < size; i++)
  96.                     mine[i] = other[i];
  97.                
  98.                 if (size < mineSize) {
  99.                     for (int i = size; i < mineSize; i++)
  100.                         mine[i] = null;
  101.                 }
  102.                
  103.                 _LoaderOptimization = copy._LoaderOptimization;
  104.                
  105.                 _AppDomainInitializerArguments = copy.AppDomainInitializerArguments;
  106.                 _ActivationArguments = copy.ActivationArguments;
  107.                 if (copyDomainBoundData)
  108.                     _AppDomainInitializer = copy.AppDomainInitializer;
  109.                 else
  110.                     _AppDomainInitializer = null;
  111.                
  112.                 _ConfigurationBytes = copy.GetConfigurationBytes();
  113.             }
  114.             else
  115.                 _LoaderOptimization = LoaderOptimization.NotSpecified;
  116.         }
  117.        
  118.         public AppDomainSetup()
  119.         {
  120.             _LoaderOptimization = LoaderOptimization.NotSpecified;
  121.         }
  122.        
  123.        
  124.         internal void SetupDefaultApplicationBase(string imageLocation)
  125.         {
  126.             StringBuilder config = null;
  127.            
  128.             char[] sep = {'\\', '/'};
  129.             int i = imageLocation.LastIndexOfAny(sep);
  130.            
  131.             string appBase = null;
  132.             if (i == -1)
  133.                 config = new StringBuilder(imageLocation);
  134.             else {
  135.                 appBase = imageLocation.Substring(0, i + 1);
  136.                 config = new StringBuilder(imageLocation.Substring(i + 1));
  137.             }
  138.            
  139.             string appName;
  140.             if (i == -1)
  141.                 appName = imageLocation;
  142.             else
  143.                 appName = imageLocation.Substring(i + 1);
  144.            
  145.             config.Append(AppDomainSetup.ConfigurationExtension);
  146.             // If there was no configuration file but we built
  147.             // the appbase from the module name then add the
  148.             // default configuration file.
  149.             if (config != null)
  150.                 this.ConfigurationFile = config.ToString();
  151.             if (appBase != null)
  152.                 this.ApplicationBase = appBase;
  153.             if (appName != null)
  154.                 this.ApplicationName = appName;
  155.         }
  156.        
  157.         internal string[] Value {
  158.             get {
  159.                 if (_Entries == null)
  160.                     _Entries = new string[LOADER_MAXIMUM];
  161.                 return _Entries;
  162.             }
  163.         }
  164.        
  165.         public string ApplicationBase {
  166.             [ResourceExposure(ResourceScope.Machine)]
  167.             [ResourceConsumption(ResourceScope.Machine)]
  168.             get { return VerifyDir(Value[(int)LoaderInformation.ApplicationBaseValue], false); }
  169.            
  170.             [ResourceExposure(ResourceScope.Machine)]
  171.             [ResourceConsumption(ResourceScope.Machine)]
  172.             set { Value[(int)LoaderInformation.ApplicationBaseValue] = NormalizePath(value, false); }
  173.         }
  174.        
  175.         [ResourceExposure(ResourceScope.Machine)]
  176.         [ResourceConsumption(ResourceScope.Machine)]
  177.         private string NormalizePath(string path, bool useAppBase)
  178.         {
  179.             if (path == null)
  180.                 return null;
  181.            
  182.             if (!useAppBase)
  183.                 path = System.Security.Util.URLString.PreProcessForExtendedPathRemoval(path, false);
  184.            
  185.             int len = path.Length;
  186.             if (len == 0)
  187.                 return null;
  188.            
  189.             #if !PLATFORM_UNIX
  190.             bool UNCpath = false;
  191.             #endif // !PLATFORM_UNIX
  192.            
  193.             if ((len > 7) && (String.Compare(path, 0, "file:", 0, 5, StringComparison.OrdinalIgnoreCase) == 0)) {
  194.                 int trim;
  195.                
  196.                 if (path[6] == '\\') {
  197.                     if ((path[7] == '\\') || (path[7] == '/')) {
  198.                        
  199.                         // Don't allow "file:\\\\", because we can't tell the difference
  200.                         // with it for "file:\\" + "\\server" and "file:\\\" + "\localpath"
  201.                         if ((len > 8) && ((path[8] == '\\') || (path[8] == '/')))
  202.                             throw new ArgumentException(Environment.GetResourceString("Argument_InvalidPathChars"));
  203.                         else
  204.                            
  205.                             // file:\\\ means local path
  206.                             #if !PLATFORM_UNIX
  207.                             trim = 8;
  208.                         #else
  209.                         // For Unix platform, trim the first 7 charcaters only.
  210.                         // Trimming the first 8 characters will cause
  211.                         // the root path separator to be trimmed away,
  212.                         // and the absolute local path becomes a relative local path.
  213.                         trim = 7;
  214.                         #endif // !PLATFORM_UNIX
  215.                     }
  216.                    
  217.                     // file:\\ means remote server
  218.                     else {
  219.                         trim = 5;
  220.                         #if !PLATFORM_UNIX
  221.                         UNCpath = true;
  222.                         #endif // !PLATFORM_UNIX
  223.                     }
  224.                 }
  225.                 else if (path[7] == '/')
  226.                    
  227.                     // local path
  228.                     #if !PLATFORM_UNIX
  229.                     trim = 8;
  230.                 #else
  231.                 // For Unix platform, trim the first 7 characters only.
  232.                 // Trimming the first 8 characters will cause
  233.                 // the root path separator to be trimmed away,
  234.                 // and the absolute local path becomes a relative local path.
  235.                 trim = 7;
  236.             }
  237.             #endif // !PLATFORM_UNIX
  238.            
  239.             // remote
  240.             else {
  241.                 // file://\\remote
  242.                 if ((len > 8) && (path[7] == '\\') && (path[8] == '\\'))
  243.                     trim = 7;
  244.                 else {
  245.                     // file://remote
  246.                     trim = 5;
  247.                     #if !PLATFORM_UNIX
  248.                     // Create valid UNC path by changing
  249.                     // all occurences of '/' to '\\' in path
  250.                     System.Text.StringBuilder winPathBuilder = new System.Text.StringBuilder(len);
  251.                     for (int i = 0; i < len; i++) {
  252.                         char c = path[i];
  253.                         if (c == '/')
  254.                             winPathBuilder.Append('\\');
  255.                         else
  256.                             winPathBuilder.Append(c);
  257.                     }
  258.                     path = winPathBuilder.ToString();
  259.                     #endif // !PLATFORM_UNIX
  260.                 }
  261.                 #if !PLATFORM_UNIX
  262.                 UNCpath = true;
  263.                 #endif // !PLATFORM_UNIX
  264.             }
  265.            
  266.             path = path.Substring(trim);
  267.             len -= trim;
  268.         }
  269.        
  270.         #if !PLATFORM_UNIX
  271.         bool localPath;
  272.     }
  273. }
  274. // UNC

Developer Fusion