AppDomain.CreateInstanceFrom Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Создает новый экземпляр заданного типа, определенного в указанном файле сборки.
Перегрузки
CreateInstanceFrom(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[], Evidence) |
Устаревшие..
Создает новый экземпляр заданного типа, определенного в указанном файле сборки. |
CreateInstanceFrom(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[]) |
Создает новый экземпляр заданного типа, определенного в указанном файле сборки. |
CreateInstanceFrom(String, String, Object[]) |
Создает новый экземпляр заданного типа, определенного в указанном файле сборки. |
CreateInstanceFrom(String, String) |
Создает новый экземпляр заданного типа, определенного в указанном файле сборки. |
CreateInstanceFrom(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[], 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 CreateInstanceFrom which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.
Создает новый экземпляр заданного типа, определенного в указанном файле сборки.
public:
virtual System::Runtime::Remoting::ObjectHandle ^ CreateInstanceFrom(System::String ^ assemblyFile, System::String ^ typeName, bool ignoreCase, System::Reflection::BindingFlags bindingAttr, System::Reflection::Binder ^ binder, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture, cli::array <System::Object ^> ^ activationAttributes, System::Security::Policy::Evidence ^ securityAttributes);
public System.Runtime.Remoting.ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes, System.Security.Policy.Evidence securityAttributes);
[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 CreateInstanceFrom which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public System.Runtime.Remoting.ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes, System.Security.Policy.Evidence securityAttributes);
abstract member CreateInstanceFrom : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] * System.Security.Policy.Evidence -> System.Runtime.Remoting.ObjectHandle
override this.CreateInstanceFrom : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] * System.Security.Policy.Evidence -> System.Runtime.Remoting.ObjectHandle
[<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 CreateInstanceFrom which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")>]
abstract member CreateInstanceFrom : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] * System.Security.Policy.Evidence -> System.Runtime.Remoting.ObjectHandle
override this.CreateInstanceFrom : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] * System.Security.Policy.Evidence -> System.Runtime.Remoting.ObjectHandle
Public Function CreateInstanceFrom (assemblyFile As String, typeName As String, ignoreCase As Boolean, bindingAttr As BindingFlags, binder As Binder, args As Object(), culture As CultureInfo, activationAttributes As Object(), securityAttributes As Evidence) As ObjectHandle
Параметры
- assemblyFile
- String
Имя (включая путь) файла, который содержит сборку, определяющую запрошенный тип. Сборка загружается с помощью метода LoadFrom(String).
- typeName
- String
Полное имя запрошенного типа, включая пространство имен, но не сборку (см. описание свойства FullName).
- ignoreCase
- Boolean
Логическое значение, указывающее, следует ли учитывать регистр при поиске.
- bindingAttr
- BindingFlags
Сочетание битовых флагов, влияющих на поиск конструктора typeName
. Если значение параметра bindingAttr
равно нулю, проводится поиск открытых конструкторов с учетом регистра.
- binder
- Binder
Объект, который допускает привязку, приведение типов аргументов, вызов элементов и извлечение объектов MemberInfo путем отражения. Если значением параметра binder
является null, то используется средство связывания по умолчанию.
- args
- Object[]
Аргументы для передачи конструктору. Массив аргументов должен соответствовать по числу, порядку и типу параметров вызываемому конструктору. Если предпочтителен конструктор без параметров, то объект args
должен быть пустым массивом или значением NULL.
- culture
- CultureInfo
Сведения о языке и региональных параметрах, которые влияют на приведение args
к формальным типам, объявленным для конструктора typeName
. Если параметр culture
имеет значение null
, для текущего потока используется объект CultureInfo.
- activationAttributes
- Object[]
Массив, состоящий из одного или нескольких атрибутов, которые могут участвовать в активации. Обычно это массив, содержащий один объект UrlAttribute, определяющий URL-адрес, необходимый для активации удаленного объекта.
Этот параметр связан с объектами, активируемыми клиентом. Активация клиентом — это устаревшая технология, которая сохраняется с целью обеспечения обратной совместимости; ее не рекомендуется использовать для разработки новых приложений. Сейчас в распределенных приложениях следует использовать Windows Communication Foundation.
- securityAttributes
- Evidence
Сведения, используемые для авторизации создания typeName
.
Возвращаемое значение
Объект, являющийся оболочкой для нового экземпляра, или значение null
, если объект typeName
не найден. Необходимо распаковать возвращенное значение, чтобы получить доступ к реальному объекту.
Реализации
- Атрибуты
Исключения
Вызывающий объект не может предоставить атрибуты активации для объекта, который не является производным от MarshalByRefObject.
-или-
securityAttributes
не является null
. Если не включена политика разграничения доступа кода для кода предыдущей версии, securityAttributes
должно иметь значение null
.
Предпринята попытка выполнения операции с выгруженным доменом приложения.
Не удалось найти assemblyFile
.
Не удалось найти typeName
в assemblyFile
.
Соответствующий общий конструктор не найден.
Вызывающий объект не имеет достаточно разрешений для вызова этого конструктора.
assemblyFile
не является допустимой сборкой для текущей загруженной среды выполнения.
Сборка или модуль был загружен дважды с двумя разными свидетельствами.
Этот экземпляр имеет значение null
.
Комментарии
Дополнительные сведения об этом методе см. в Activator.CreateInstanceFrom разделе метод .
CreateInstanceFrom Если метод используется для создания экземпляра в домене целевого приложения, отличном от домена приложения, из которого выполняется вызов, сборка загружается в домен целевого приложения. Однако если экземпляр раскроется в домене вызывающего приложения, использование распакованного экземпляра определенными способами может привести к загрузке сборки в домен вызывающего приложения. Например, после распакованного экземпляра можно запросить сведения о его типе, чтобы вызвать методы с поздней привязкой. При загрузке сборки в домен вызывающего приложения могут возникать исключения.
Если другая версия той же сборки ранее была загружена в вызывающий домен приложения или путь загрузки вызывающего домена приложения отличается от пути к целевому домену приложения, могут возникать такие исключения, как MissingMethodException .
Если вызывающий домен приложения выполняет вызовы типа экземпляра с ранней привязкой, InvalidCastException может быть вызвано при попытке привести экземпляр.
См. также раздел
Применяется к
CreateInstanceFrom(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
- Исходный код:
- AppDomain.cs
- Исходный код:
- AppDomain.cs
- Исходный код:
- AppDomain.cs
Создает новый экземпляр заданного типа, определенного в указанном файле сборки.
public:
System::Runtime::Remoting::ObjectHandle ^ CreateInstanceFrom(System::String ^ assemblyFile, System::String ^ typeName, bool ignoreCase, System::Reflection::BindingFlags bindingAttr, System::Reflection::Binder ^ binder, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture, cli::array <System::Object ^> ^ activationAttributes);
public System.Runtime.Remoting.ObjectHandle? CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture, object?[]? activationAttributes);
public System.Runtime.Remoting.ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes);
member this.CreateInstanceFrom : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] -> System.Runtime.Remoting.ObjectHandle
Public Function CreateInstanceFrom (assemblyFile As String, typeName As String, ignoreCase As Boolean, bindingAttr As BindingFlags, binder As Binder, args As Object(), culture As CultureInfo, activationAttributes As Object()) As ObjectHandle
Параметры
- assemblyFile
- String
Имя (включая путь) файла, который содержит сборку, определяющую запрошенный тип. Сборка загружается с помощью метода LoadFrom(String).
- typeName
- String
Полное имя запрошенного типа, включая пространство имен, но не сборку (см. описание свойства FullName).
- ignoreCase
- Boolean
Логическое значение, указывающее, следует ли учитывать регистр при поиске.
- bindingAttr
- BindingFlags
Сочетание битовых флагов, влияющих на поиск конструктора typeName
. Если значение параметра bindingAttr
равно нулю, проводится поиск открытых конструкторов с учетом регистра.
- binder
- Binder
Объект, который допускает привязку, приведение типов аргументов, вызов элементов и извлечение объектов MemberInfo путем отражения. Если значением параметра binder
является null, то используется средство связывания по умолчанию.
- args
- Object[]
Аргументы для передачи конструктору. Массив аргументов должен соответствовать по числу, порядку и типу параметров вызываемому конструктору. Если предпочтителен конструктор без параметров, то объект args
должен быть пустым массивом или значением NULL.
- culture
- CultureInfo
Сведения о языке и региональных параметрах, которые влияют на приведение args
к формальным типам, объявленным для конструктора typeName
. Если параметр culture
имеет значение null
, для текущего потока используется объект CultureInfo.
- activationAttributes
- Object[]
Массив, состоящий из одного или нескольких атрибутов, которые могут участвовать в активации. Обычно это массив, содержащий один объект UrlAttribute, определяющий URL-адрес, необходимый для активации удаленного объекта.
Этот параметр связан с объектами, активируемыми клиентом. Активация клиентом — это устаревшая технология, которая сохраняется с целью обеспечения обратной совместимости; ее не рекомендуется использовать для разработки новых приложений. Сейчас в распределенных приложениях следует использовать Windows Communication Foundation.
Возвращаемое значение
Объект, являющийся оболочкой для нового экземпляра, или значение null
, если объект typeName
не найден. Необходимо распаковать возвращенное значение, чтобы получить доступ к реальному объекту.
Исключения
Вызывающий объект не может предоставить атрибуты активации для объекта, который не является производным от MarshalByRefObject.
Предпринята попытка выполнения операции с выгруженным доменом приложения.
Не удалось найти assemblyFile
.
Не удалось найти typeName
в assemblyFile
.
Соответствующий общий конструктор не найден.
Вызывающий объект не имеет достаточно разрешений для вызова этого конструктора.
assemblyFile
не является допустимой сборкой для текущей загруженной среды выполнения.
Сборка или модуль был загружен дважды с двумя разными свидетельствами.
Этот экземпляр имеет значение null
.
Комментарии
Дополнительные сведения см. в описании метода Activator.CreateInstanceFrom.
CreateInstanceFrom Если метод используется для создания экземпляра в домене целевого приложения, отличном от домена приложения, из которого выполняется вызов, сборка загружается в домен целевого приложения. Однако если экземпляр раскроется в домене вызывающего приложения, использование распакованного экземпляра определенными способами может привести к загрузке сборки в домен вызывающего приложения. Например, после распакованного экземпляра можно запросить сведения о его типе, чтобы вызвать методы с поздней привязкой. При загрузке сборки в домен вызывающего приложения могут возникать исключения.
Если другая версия той же сборки ранее была загружена в вызывающий домен приложения или путь загрузки вызывающего домена приложения отличается от пути к целевому домену приложения, могут возникать такие исключения, как MissingMethodException .
Если вызывающий домен приложения выполняет вызовы типа экземпляра с ранней привязкой, InvalidCastException может быть вызвано при попытке привести экземпляр.
См. также раздел
Применяется к
CreateInstanceFrom(String, String, Object[])
- Исходный код:
- AppDomain.cs
- Исходный код:
- AppDomain.cs
- Исходный код:
- AppDomain.cs
Создает новый экземпляр заданного типа, определенного в указанном файле сборки.
public:
System::Runtime::Remoting::ObjectHandle ^ CreateInstanceFrom(System::String ^ assemblyFile, System::String ^ typeName, cli::array <System::Object ^> ^ activationAttributes);
public:
virtual System::Runtime::Remoting::ObjectHandle ^ CreateInstanceFrom(System::String ^ assemblyFile, System::String ^ typeName, cli::array <System::Object ^> ^ activationAttributes);
public System.Runtime.Remoting.ObjectHandle? CreateInstanceFrom (string assemblyFile, string typeName, object?[]? activationAttributes);
public System.Runtime.Remoting.ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, object[] activationAttributes);
member this.CreateInstanceFrom : string * string * obj[] -> System.Runtime.Remoting.ObjectHandle
abstract member CreateInstanceFrom : string * string * obj[] -> System.Runtime.Remoting.ObjectHandle
override this.CreateInstanceFrom : string * string * obj[] -> System.Runtime.Remoting.ObjectHandle
Public Function CreateInstanceFrom (assemblyFile As String, typeName As String, activationAttributes As Object()) As ObjectHandle
Параметры
- assemblyFile
- String
Имя (включая путь) файла, который содержит сборку, определяющую запрошенный тип. Сборка загружается с помощью метода LoadFrom(String).
- typeName
- String
Полное имя запрошенного типа, включая пространство имен, но не сборку (см. описание свойства FullName).
- activationAttributes
- Object[]
Массив, состоящий из одного или нескольких атрибутов, которые могут участвовать в активации. Обычно это массив, содержащий один объект UrlAttribute, определяющий URL-адрес, необходимый для активации удаленного объекта.
Этот параметр связан с объектами, активируемыми клиентом. Активация клиентом — это устаревшая технология, которая сохраняется с целью обеспечения обратной совместимости; ее не рекомендуется использовать для разработки новых приложений. Сейчас в распределенных приложениях следует использовать Windows Communication Foundation.
Возвращаемое значение
Объект, являющийся оболочкой для нового экземпляра, или значение null
, если объект typeName
не найден. Необходимо распаковать возвращенное значение, чтобы получить доступ к реальному объекту.
Реализации
Исключения
assemblyFile
имеет значение null
.
Не удалось найти assemblyFile
.
Не удалось найти typeName
в assemblyFile
.
Вызывающий объект не имеет достаточно разрешений для вызова этого конструктора.
Соответствующий общий конструктор не найден.
Вызывающий объект не может предоставить атрибуты активации для объекта, который не является производным от MarshalByRefObject.
Предпринята попытка выполнения операции с выгруженным доменом приложения.
assemblyFile
не является допустимой сборкой для текущей загруженной среды выполнения.
Сборка или модуль был загружен дважды с двумя разными свидетельствами.
Этот экземпляр имеет значение null
.
Комментарии
Вызывается конструктор без параметров для typeName
.
Дополнительные сведения об этом методе см. в описании Activator.CreateInstanceFrom метода .
CreateInstanceFrom Если метод используется для создания экземпляра в домене целевого приложения, отличном от домена приложения, из которого выполняется вызов, сборка загружается в домен целевого приложения. Однако если экземпляр распаковано в домене вызывающего приложения, использование этого экземпляра определенными способами может привести к загрузке сборки в домен вызывающего приложения. Например, после распакованного экземпляра можно запросить сведения о его типе, чтобы вызвать методы с поздней привязкой. При загрузке сборки в домен вызывающего приложения могут возникать исключения.
Если другая версия той же сборки ранее была загружена в домен вызывающего приложения или путь загрузки вызывающего домена приложения отличается от пути к целевому домену приложения, могут возникнуть исключения, например MissingMethodException .
Если домен вызывающего приложения выполняет вызовы типа экземпляра с ранней привязкой, InvalidCastException может вызываться при попытке привести экземпляр.
См. также раздел
Применяется к
CreateInstanceFrom(String, String)
- Исходный код:
- AppDomain.cs
- Исходный код:
- AppDomain.cs
- Исходный код:
- AppDomain.cs
Создает новый экземпляр заданного типа, определенного в указанном файле сборки.
public:
System::Runtime::Remoting::ObjectHandle ^ CreateInstanceFrom(System::String ^ assemblyFile, System::String ^ typeName);
public:
virtual System::Runtime::Remoting::ObjectHandle ^ CreateInstanceFrom(System::String ^ assemblyFile, System::String ^ typeName);
public System.Runtime.Remoting.ObjectHandle? CreateInstanceFrom (string assemblyFile, string typeName);
public System.Runtime.Remoting.ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName);
member this.CreateInstanceFrom : string * string -> System.Runtime.Remoting.ObjectHandle
abstract member CreateInstanceFrom : string * string -> System.Runtime.Remoting.ObjectHandle
override this.CreateInstanceFrom : string * string -> System.Runtime.Remoting.ObjectHandle
Public Function CreateInstanceFrom (assemblyFile As String, typeName As String) As ObjectHandle
Параметры
- assemblyFile
- String
Имя (включая путь) файла, который содержит сборку, определяющую запрошенный тип. Сборка загружается с помощью метода LoadFrom(String).
- typeName
- String
Полное имя запрошенного типа, включая пространство имен, но не сборку (см. описание свойства FullName).
Возвращаемое значение
Объект, являющийся оболочкой для нового экземпляра, или значение null
, если объект typeName
не найден. Необходимо распаковать возвращенное значение, чтобы получить доступ к реальному объекту.
Реализации
Исключения
Не удалось найти assemblyFile
.
Не удалось найти typeName
в assemblyFile
.
Предпринята попытка выполнения операции с выгруженным доменом приложения.
Открытый конструктор без параметров не найден.
Вызывающий объект не имеет достаточно разрешений для вызова этого конструктора.
assemblyFile
не является допустимой сборкой для текущей загруженной среды выполнения.
Сборка или модуль был загружен дважды с двумя разными свидетельствами.
Этот экземпляр имеет значение null
.
Примеры
В следующем примере показано, как использовать перегрузку CreateInstanceFrom(String, String) метода для создания экземпляра объекта в целевом домене приложения и вызова его методов.
В примере определяется MarshalableExample
класс , который можно маршалировать через границы домена приложения. В примере создается путь к выполняемой в данный момент сборке, создается целевой домен приложения и используется перегрузка CreateInstanceFrom(String, String) метода для загрузки примера сборки в домен целевого приложения и создания экземпляра MarshalableExample
.
Примечание
В этом примере путь является абсолютным, но относительный путь также будет работать, так как Assembly.LoadFrom метод используется для загрузки сборки.
После распакрашивания дескриптора объекта в примере демонстрируются три способа использования объекта в целевом домене приложения:
Вызов метода с поздней привязкой с использованием отражения. Для этого требуются сведения о типе, что приводит к загрузке сборки в домен приложения вызывающего объекта. (В этом примере она уже загружена.)
Приведение объекта к интерфейсу, известному как вызывающей стороне, так и вызывающей стороне. Если интерфейс определен в вызывающей сборке или в третьей сборке, на которую ссылаются как вызывающий, так и вызываемый объект, вызываемая сборка не загружается в домен приложения вызывающего объекта.
Использование объекта напрямую, если его тип известен вызывающей объекту. Сборка должна быть загружена в домен приложения вызывающего объекта.
Еще один способ избежать загрузки вызываемой сборки в домен приложения вызывающего объекта — наследование вызывающего объекта от MarshalByRefObject класса и определение метода, который может выполняться в целевом домене приложения. Этот метод может использовать отражение для проверки целевой сборки, так как целевая сборка уже загружена в домен целевого приложения. См. пример для DynamicDirectory свойства .
using namespace System;
public interface class ITest
{
void Test(String^ greeting);
};
public ref class MarshalableExample : MarshalByRefObject, ITest
{
public:
virtual void Test(String^ greeting)
{
Console::WriteLine("{0} from '{1}'!", greeting,
AppDomain::CurrentDomain->FriendlyName);
}
};
void main()
{
// Construct a path to the current assembly.
String^ assemblyPath = Environment::CurrentDirectory + "\\" +
MarshalableExample::typeid->Assembly->GetName()->Name + ".exe";
AppDomain^ ad = AppDomain::CreateDomain("MyDomain");
System::Runtime::Remoting::ObjectHandle^ oh =
ad->CreateInstanceFrom(assemblyPath, "MarshalableExample");
Object^ obj = oh->Unwrap();
// Three ways to use the newly created object, depending on how
// much is known about the type: Late bound, early bound through
// a mutually known interface, or early binding of a known type.
//
obj->GetType()->InvokeMember("Test",
System::Reflection::BindingFlags::InvokeMethod,
Type::DefaultBinder, obj, gcnew array<Object^> { "Hello" });
ITest^ it = (ITest^) obj;
it->Test("Hi");
MarshalableExample^ ex = (MarshalableExample^) obj;
ex->Test("Goodbye");
}
/* This example produces the following output:
Hello from 'MyDomain'!
Hi from 'MyDomain'!
Goodbye from 'MyDomain'!
*/
using System;
public interface ITest
{
void Test(string greeting);
}
public class MarshalableExample : MarshalByRefObject, ITest
{
static void Main()
{
// Construct a path to the current assembly.
string assemblyPath = Environment.CurrentDirectory + "\\" +
typeof(MarshalableExample).Assembly.GetName().Name + ".exe";
AppDomain ad = AppDomain.CreateDomain("MyDomain");
System.Runtime.Remoting.ObjectHandle oh =
ad.CreateInstanceFrom(assemblyPath, "MarshalableExample");
object obj = oh.Unwrap();
// Three ways to use the newly created object, depending on how
// much is known about the type: Late bound, early bound through
// a mutually known interface, or early binding of a known type.
//
obj.GetType().InvokeMember("Test",
System.Reflection.BindingFlags.InvokeMethod,
Type.DefaultBinder, obj, new object[] { "Hello" });
ITest it = (ITest) obj;
it.Test("Hi");
MarshalableExample ex = (MarshalableExample) obj;
ex.Test("Goodbye");
}
public void Test(string greeting)
{
Console.WriteLine("{0} from '{1}'!", greeting,
AppDomain.CurrentDomain.FriendlyName);
}
}
/* This example produces the following output:
Hello from 'MyDomain'!
Hi from 'MyDomain'!
Goodbye from 'MyDomain'!
*/
open System
type ITest =
abstract Test: string -> unit
type MarshalableExample() =
inherit MarshalByRefObject()
member _.Test greeting =
printfn $"{greeting} from '{AppDomain.CurrentDomain.FriendlyName}'!"
interface ITest with
member this.Test message = this.Test message
// Construct a path to the current assembly.
let assemblyPath =
Environment.CurrentDirectory + "\\" + typeof<MarshalableExample>.Assembly.GetName().Name + ".exe"
let ad = AppDomain.CreateDomain "MyDomain"
let oh =
ad.CreateInstanceFrom(assemblyPath, "MarshalableExample")
let obj = oh.Unwrap()
// Three ways to use the newly created object, depending on how
// much is known about the type: Late bound, early bound through
// a mutually known interface, or early binding of a known type.
//
obj.GetType().InvokeMember("Test",
System.Reflection.BindingFlags.InvokeMethod,
Type.DefaultBinder, obj, [| box "Hello" |])
|> ignore
let it = obj :?> ITest
it.Test "Hi"
let ex = obj :?> MarshalableExample
ex.Test("Goodbye")
(* This example produces the following output:
Hello from 'MyDomain'!
Hi from 'MyDomain'!
Goodbye from 'MyDomain'!
*)
Public Interface ITest
Sub Test(ByVal greeting As String)
End Interface
Public Class MarshalableExample
Inherits MarshalByRefObject
Implements ITest
Shared Sub Main()
' Construct a path to the current assembly.
Dim assemblyPath As String = Environment.CurrentDirectory & "\" &
GetType(MarshalableExample).Assembly.GetName().Name & ".exe"
Dim ad As AppDomain = AppDomain.CreateDomain("MyDomain")
Dim oh As System.Runtime.Remoting.ObjectHandle =
ad.CreateInstanceFrom(assemblyPath, "MarshalableExample")
Dim obj As Object = oh.Unwrap()
' Three ways to use the newly created object, depending on how
' much is known about the type: Late bound, early bound through
' a mutually known interface, or early binding of a known type.
'
obj.GetType().InvokeMember("Test",
System.Reflection.BindingFlags.InvokeMethod,
Type.DefaultBinder, obj, New Object() { "Hello" })
Dim it As ITest = CType(obj, ITest)
it.Test("Hi")
Dim ex As MarshalableExample = CType(obj, MarshalableExample)
ex.Test("Goodbye")
End Sub
Public Sub Test(ByVal greeting As String) Implements ITest.Test
Console.WriteLine("{0} from '{1}'!", greeting,
AppDomain.CurrentDomain.FriendlyName)
End Sub
End Class
' This example produces the following output:
'
'Hello from 'MyDomain'!
'Hi from 'MyDomain'!
'Goodbye from 'MyDomain'!
Комментарии
Вызывается конструктор без параметров для typeName
.
Дополнительные сведения см. в описании метода Activator.CreateInstanceFrom.
CreateInstanceFrom Если метод используется для создания экземпляра в домене целевого приложения, отличном от домена приложения, из которого выполняется вызов, сборка загружается в домен целевого приложения. Однако если экземпляр распаковано в домене вызывающего приложения, использование этого экземпляра определенными способами может привести к загрузке сборки в домен вызывающего приложения. Например, после распакованного экземпляра можно запросить сведения о его типе, чтобы вызвать методы с поздней привязкой. При загрузке сборки в домен вызывающего приложения могут возникать исключения.
Если другая версия той же сборки ранее была загружена в домен вызывающего приложения или путь загрузки вызывающего домена приложения отличается от пути к целевому домену приложения, могут возникнуть исключения, например MissingMethodException .
Если домен вызывающего приложения выполняет вызовы типа экземпляра с ранней привязкой, InvalidCastException может вызываться при попытке привести экземпляр.