Прочитать на английском

Поделиться через


AppDomain.Load Метод

Определение

Загружает Assembly в этот домен приложения.

Перегрузки

Load(Byte[])

Загружает Assembly с общим форматом файлов объектов (COFF), содержащим создаваемый Assembly.

Load(AssemblyName)

Загружает Assembly, учитывая AssemblyName.

Load(String)

Загружает Assembly с отображаемым именем.

Load(Byte[], Byte[])

Загружает Assembly с общим форматом файлов объектов (COFF), содержащим создаваемый Assembly. Необработанные байты, представляющие символы для Assembly, также загружаются.

Load(AssemblyName, Evidence)
Устаревшие..

Загружает Assembly, учитывая AssemblyName.

Load(String, Evidence)
Устаревшие..

Загружает Assembly с отображаемым именем.

Load(Byte[], Byte[], Evidence)
Устаревшие..

Загружает Assembly с общим форматом файлов объектов (COFF), содержащим создаваемый Assembly. Необработанные байты, представляющие символы для Assembly, также загружаются.

Load(Byte[])

Исходный код:
AppDomain.cs
Исходный код:
AppDomain.cs
Исходный код:
AppDomain.cs

Загружает Assembly с общим форматом файлов объектов (COFF), содержащим создаваемый Assembly.

C#
public System.Reflection.Assembly Load (byte[] rawAssembly);

Параметры

rawAssembly
Byte[]

Массив типа byte, представляющий собой образ на основе COFF, содержащий созданную сборку.

Возвращаемое значение

Загруженная сборка.

Реализации

Исключения

rawAssembly null.

rawAssembly не является допустимой сборкой для текущей загруженной среды выполнения.

Операция выполняется в выгруженном домене приложения.

Сборка или модуль была загружена дважды с двумя разными доказательствами.

Примеры

В следующем примере показано использование необработанной сборки.

Для выполнения этого примера кода необходимо указать полное имя сборки. Сведения о том, как получить полное имя сборки, см. в разделе Имена сборок.

C#
using System;
using System.IO;
using System.Reflection;
using System.Reflection.Emit;

class LoadRawSnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolver);

      InstantiateMyType(currentDomain);   // OK!
   }

   static void InstantiateMyType(AppDomain domain) {
      try {
     // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   // Loads the content of a file to a byte array.
   static byte[] loadFile(string filename) {
      FileStream fs = new FileStream(filename, FileMode.Open);
      byte[] buffer = new byte[(int) fs.Length];
      fs.Read(buffer, 0, buffer.Length);
      fs.Close();

      return buffer;
   }

   static Assembly MyResolver(object sender, ResolveEventArgs args) {
      AppDomain domain = (AppDomain) sender;

      // Once the files are generated, this call is
      // actually no longer necessary.
      EmitAssembly(domain);

      byte[] rawAssembly = loadFile("temp.dll");
      byte[] rawSymbolStore = loadFile("temp.pdb");
      Assembly assembly = domain.Load(rawAssembly, rawSymbolStore);

      return assembly;
   }

   // Creates a dynamic assembly with symbol information
   // and saves them to temp.dll and temp.pdb
   static void EmitAssembly(AppDomain domain) {
      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule", "temp.dll", true);
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Public);

      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();
      ilGenerator.EmitWriteLine("MyType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      assemblyBuilder.Save("temp.dll");
   }
}

Комментарии

Сведения, которые являются общими для всех перегрузок этого метода, см. в Load(AssemblyName) перегрузке метода.

Начиная с .NET Framework 4 уровень доверия сборки, загруженной с помощью этого метода, совпадает с уровнем доверия домена приложения.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Load(AssemblyName)

Исходный код:
AppDomain.cs
Исходный код:
AppDomain.cs
Исходный код:
AppDomain.cs

Загружает Assembly, учитывая AssemblyName.

C#
public System.Reflection.Assembly Load (System.Reflection.AssemblyName assemblyRef);

Параметры

assemblyRef
AssemblyName

Объект, описывающий сборку для загрузки.

Возвращаемое значение

Загруженная сборка.

Реализации

Исключения

assemblyRef null.

assemblyRef не найден.

assemblyRef не является допустимой сборкой для текущей загруженной среды выполнения.

Операция выполняется в выгруженном домене приложения.

Сборка или модуль была загружена дважды с двумя разными доказательствами.

Комментарии

Этот метод следует использовать только для загрузки сборки в текущий домен приложения. Этот метод предоставляется в качестве удобства для вызывающих лиц взаимодействия, которые не могут вызывать статический метод Assembly.Load. Чтобы загрузить сборки в другие домены приложений, используйте такой метод, как CreateInstanceAndUnwrap.

Если версия запрошенной сборки уже загружена, этот метод возвращает загруженную сборку, даже если запрашивается другая версия.

Указание частичного имени сборки для assemblyRef не рекомендуется. (Частичное имя пропускает один или несколько маркеров языка и региональных параметров, версий или открытого ключа. Для перегрузки, которые принимают строку вместо объекта AssemblyName, "MyAssembly, Version=1.0.0.0" является примером частичного имени и "MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=18ab344da84b47" является примером полного имени.) Использование частичных имен негативно влияет на производительность. Кроме того, частичное имя сборки может загружать сборку из глобального кэша сборок только в том случае, если в базовом каталоге приложения есть точную копию сборки (BaseDirectory или AppDomainSetup.ApplicationBase).

Если текущий объект AppDomain представляет домен приложения A, а метод Load вызывается из домена приложения B, сборка загружается в оба домена приложения. Например, следующий код загружает MyAssembly в новый домен приложения ChildDomain, а также в домен приложения, где выполняется код:

C#
AppDomain ad = AppDomain.CreateDomain("ChildDomain");
ad.Load("MyAssembly");

Сборка загружается в оба домена, так как Assembly не является производным от MarshalByRefObject, поэтому возвращаемое значение метода Load невозможно маршалировать. Вместо этого среда CLR пытается загрузить сборку в вызывающий домен приложения. Сборки, загруженные в два домена приложения, могут отличаться, если параметры пути для двух доменов приложений отличаются.

Примечание

Если задано как свойство AssemblyName.Name, так и свойство AssemblyName.CodeBase, первая попытка загрузить сборку использует отображаемое имя (включая версию, язык и региональные параметры и т. д.), как возвращается свойством Assembly.FullName). Если файл не найден, свойство CodeBase используется для поиска сборки. Если сборка найдена с помощью CodeBase, отображаемое имя соответствует сборке. Если совпадение завершается ошибкой, создается FileLoadException.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Load(String)

Исходный код:
AppDomain.cs
Исходный код:
AppDomain.cs
Исходный код:
AppDomain.cs

Загружает Assembly с отображаемым именем.

C#
public System.Reflection.Assembly Load (string assemblyString);

Параметры

assemblyString
String

Отображаемое имя сборки. См. FullName.

Возвращаемое значение

Загруженная сборка.

Реализации

Исключения

assemblyString null

assemblyString не найден.

assemblyString не является допустимой сборкой для текущей загруженной среды выполнения.

Операция выполняется в выгруженном домене приложения.

Сборка или модуль была загружена дважды с двумя разными доказательствами.

Комментарии

Сведения, которые являются общими для всех перегрузок этого метода, см. в Load(AssemblyName) перегрузке метода.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Load(Byte[], Byte[])

Исходный код:
AppDomain.cs
Исходный код:
AppDomain.cs
Исходный код:
AppDomain.cs

Загружает Assembly с общим форматом файлов объектов (COFF), содержащим создаваемый Assembly. Необработанные байты, представляющие символы для Assembly, также загружаются.

C#
public System.Reflection.Assembly Load (byte[] rawAssembly, byte[]? rawSymbolStore);
C#
public System.Reflection.Assembly Load (byte[] rawAssembly, byte[] rawSymbolStore);

Параметры

rawAssembly
Byte[]

Массив типа byte, представляющий собой образ на основе COFF, содержащий созданную сборку.

rawSymbolStore
Byte[]

Массив типа byte, содержащий необработанные байты, представляющие символы сборки.

Возвращаемое значение

Загруженная сборка.

Реализации

Исключения

rawAssembly null.

rawAssembly не является допустимой сборкой для текущей загруженной среды выполнения.

Операция выполняется в выгруженном домене приложения.

Сборка или модуль была загружена дважды с двумя разными доказательствами.

Примеры

В следующем примере показано использование необработанной сборки.

Для выполнения этого примера кода необходимо указать полное имя сборки. Сведения о том, как получить полное имя сборки, см. в разделе Имена сборок.

C#
using System;
using System.IO;
using System.Reflection;
using System.Reflection.Emit;

class LoadRawSnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolver);

      InstantiateMyType(currentDomain);   // OK!
   }

   static void InstantiateMyType(AppDomain domain) {
      try {
     // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   // Loads the content of a file to a byte array.
   static byte[] loadFile(string filename) {
      FileStream fs = new FileStream(filename, FileMode.Open);
      byte[] buffer = new byte[(int) fs.Length];
      fs.Read(buffer, 0, buffer.Length);
      fs.Close();

      return buffer;
   }

   static Assembly MyResolver(object sender, ResolveEventArgs args) {
      AppDomain domain = (AppDomain) sender;

      // Once the files are generated, this call is
      // actually no longer necessary.
      EmitAssembly(domain);

      byte[] rawAssembly = loadFile("temp.dll");
      byte[] rawSymbolStore = loadFile("temp.pdb");
      Assembly assembly = domain.Load(rawAssembly, rawSymbolStore);

      return assembly;
   }

   // Creates a dynamic assembly with symbol information
   // and saves them to temp.dll and temp.pdb
   static void EmitAssembly(AppDomain domain) {
      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule", "temp.dll", true);
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Public);

      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();
      ilGenerator.EmitWriteLine("MyType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      assemblyBuilder.Save("temp.dll");
   }
}

Комментарии

Сведения, которые являются общими для всех перегрузок этого метода, см. в Load(AssemblyName) перегрузке метода.

Начиная с .NET Framework 4 уровень доверия сборки, загруженной с помощью этого метода, совпадает с уровнем доверия домена приложения.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Load(AssemblyName, Evidence)

Внимание!

Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of Load which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.

Загружает Assembly, учитывая AssemblyName.

C#
public System.Reflection.Assembly Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity);
C#
[System.Obsolete("Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of Load which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public System.Reflection.Assembly Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity);

Параметры

assemblyRef
AssemblyName

Объект, описывающий сборку для загрузки.

assemblySecurity
Evidence

Доказательства загрузки сборки.

Возвращаемое значение

Загруженная сборка.

Реализации

Атрибуты

Исключения

assemblyRef null

assemblyRef не найден.

assemblyRef не является допустимой сборкой для текущей загруженной среды выполнения.

Операция выполняется в выгруженном домене приложения.

Сборка или модуль была загружена дважды с двумя разными доказательствами.

Комментарии

Сведения, которые являются общими для всех перегрузок этого метода, см. в Load(AssemblyName) перегрузке метода.

Применяется к

.NET Framework 4.8.1 и другие версии
Продукт Версии (Устарело)
.NET Framework 1.1, 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)

Load(String, Evidence)

Внимание!

Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of Load which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.

Загружает Assembly с отображаемым именем.

C#
public System.Reflection.Assembly Load (string assemblyString, System.Security.Policy.Evidence assemblySecurity);
C#
[System.Obsolete("Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of Load which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public System.Reflection.Assembly Load (string assemblyString, System.Security.Policy.Evidence assemblySecurity);

Параметры

assemblyString
String

Отображаемое имя сборки. См. FullName.

assemblySecurity
Evidence

Доказательства загрузки сборки.

Возвращаемое значение

Загруженная сборка.

Реализации

Атрибуты

Исключения

assemblyString null

assemblyString не найден.

assemblyString не является допустимой сборкой для текущей загруженной среды выполнения.

Операция выполняется в выгруженном домене приложения.

Сборка или модуль была загружена дважды с двумя разными доказательствами.

Комментарии

Сведения, которые являются общими для всех перегрузок этого метода, см. в Load(AssemblyName) перегрузке метода.

Применяется к

.NET Framework 4.8.1 и другие версии
Продукт Версии (Устарело)
.NET Framework 1.1, 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)

Load(Byte[], Byte[], Evidence)

Внимание!

Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of Load which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkId=155570 for more information.

Загружает Assembly с общим форматом файлов объектов (COFF), содержащим создаваемый Assembly. Необработанные байты, представляющие символы для Assembly, также загружаются.

C#
public System.Reflection.Assembly Load (byte[] rawAssembly, byte[] rawSymbolStore, System.Security.Policy.Evidence securityEvidence);
C#
[System.Obsolete("Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of Load which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkId=155570 for more information.")]
public System.Reflection.Assembly Load (byte[] rawAssembly, byte[] rawSymbolStore, System.Security.Policy.Evidence securityEvidence);

Параметры

rawAssembly
Byte[]

Массив типа byte, представляющий собой образ на основе COFF, содержащий созданную сборку.

rawSymbolStore
Byte[]

Массив типа byte, содержащий необработанные байты, представляющие символы сборки.

securityEvidence
Evidence

Доказательства загрузки сборки.

Возвращаемое значение

Загруженная сборка.

Реализации

Атрибуты

Исключения

rawAssembly null.

rawAssembly не является допустимой сборкой для текущей загруженной среды выполнения.

Операция выполняется в выгруженном домене приложения.

Сборка или модуль была загружена дважды с двумя разными доказательствами.

securityEvidence не null. Если устаревшая политика CAS не включена, securityEvidence следует null.

Примеры

В следующем примере показано использование необработанной сборки.

Для выполнения этого примера кода необходимо указать полное имя сборки. Сведения о том, как получить полное имя сборки, см. в разделе Имена сборок.

C#
using System;
using System.IO;
using System.Reflection;
using System.Reflection.Emit;

class LoadRawSnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolver);

      InstantiateMyType(currentDomain);   // OK!
   }

   static void InstantiateMyType(AppDomain domain) {
      try {
     // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   // Loads the content of a file to a byte array.
   static byte[] loadFile(string filename) {
      FileStream fs = new FileStream(filename, FileMode.Open);
      byte[] buffer = new byte[(int) fs.Length];
      fs.Read(buffer, 0, buffer.Length);
      fs.Close();

      return buffer;
   }

   static Assembly MyResolver(object sender, ResolveEventArgs args) {
      AppDomain domain = (AppDomain) sender;

      // Once the files are generated, this call is
      // actually no longer necessary.
      EmitAssembly(domain);

      byte[] rawAssembly = loadFile("temp.dll");
      byte[] rawSymbolStore = loadFile("temp.pdb");
      Assembly assembly = domain.Load(rawAssembly, rawSymbolStore);

      return assembly;
   }

   // Creates a dynamic assembly with symbol information
   // and saves them to temp.dll and temp.pdb
   static void EmitAssembly(AppDomain domain) {
      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule", "temp.dll", true);
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Public);

      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();
      ilGenerator.EmitWriteLine("MyType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      assemblyBuilder.Save("temp.dll");
   }
}

Комментарии

Сведения, которые являются общими для всех перегрузок этого метода, см. в Load(AssemblyName) перегрузке метода.

Начиная с .NET Framework 4 уровень доверия сборки, загруженной с помощью этого метода, совпадает с уровнем доверия домена приложения.

Применяется к

.NET Framework 4.8.1 и другие версии
Продукт Версии (Устарело)
.NET Framework 1.1, 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)