Я могу загрузить блок.NET во времени выполнения и инстанцировать типа, зная только имя?

175
задан Anthony Mastrean 28 July 2011 в 16:11
поделиться

9 ответов

Да. Необходимо использовать Assembly.LoadFrom для загрузки блока в память, тогда можно использовать Activator.CreateInstance для создания экземпляра предпочтительного типа. Необходимо будет посмотреть тип сначала использование отражения. Вот простой пример:

Assembly assembly = Assembly.LoadFrom("MyNice.dll");

Type type = assembly.GetType("MyType");

object instanceOfMyType = Activator.CreateInstance(type);

Обновление

, Когда у Вас есть имя файла блока и имя типа, можно использовать Activator.CreateInstance(assemblyName, typeName) , чтобы попросить, чтобы разрешение типа.NET разрешило это в тип. Вы могли обернуть это с попыткой/выгодой так, чтобы, если она перестала работать, можно было выполнить поиск каталогов, где можно конкретно сохранить дополнительные блоки, которые иначе не могли бы искаться. Это использовало бы предыдущий метод в той точке.

218
ответ дан Ian Kemp 23 November 2019 в 20:27
поделиться

Рассмотрите ограничения различного Load* методы. От MSDN документы...

LoadFile не загружает файлы в контекст LoadFrom, и не разрешает зависимости использование пути загрузки, как метод LoadFrom делает.

[еще 117] информация о Контекстах Загрузки может быть найдена в LoadFrom документы.

35
ответ дан Anthony Mastrean 23 November 2019 в 20:27
поделиться

Активатор. CreateInstance должен работать.

IFace object = (IFace)Activator.CreateInstance( "AssemblyName",
                                                "TypeName" )
                               .Unwrap();

Примечание: имя типа должно быть полностью определенным типом.

Пример:

var aray = (IList)Activator.CreateInstance("mscorlib","System.Collections.ArrayList").Unwrap();
aray.Add(10);

foreach (object obj in aray)
{
    Console.WriteLine(obj);
}
18
ответ дан tvanfosson 23 November 2019 в 20:27
поделиться

Да. У меня нет примеров, которые я сделал лично доступный прямо сейчас. Я отправлю позже, когда я найду некоторых. В основном Вы будете использовать отражение, чтобы загрузить блок и затем вытянуть безотносительно типов, в которых Вы нуждаетесь для него.

Тем временем, эта ссылка должна запустить Вас:

Используя отражение для загрузки не имеющих ссылки блоков во времени выполнения

2
ответ дан Giovanni Galbo 23 November 2019 в 20:27
поделиться
((ISomeInterface)Activator.CreateInstance(Assembly.LoadFile("somePath").GetTypes()[0])).SomeInterfaceMethod();
2
ответ дан abatishchev 23 November 2019 в 20:27
поделиться

Можно загрузить использование блока *блок. Загрузка ** методы. Используя Активатор. CreateInstance можно создать новые экземпляры типа, который Вы хотите. Следует иметь в виду, что необходимо использовать полное имя типа класса, который Вы хотите загрузить (например Пространство имен. SubNamespace. ClassName). Используя метод InvokeMember класс Типа можно вызвать методы на тип.

кроме того, примите во внимание, что когда-то загруженный, блок не может быть разгружен, пока целый AppDomain не разгружен также (это - в основном утечка памяти).

2
ответ дан Dario Solera 23 November 2019 в 20:27
поделиться

Завися, насколько внутренний этот вид функциональности к Вашему проекту, Вы могли бы хотеть рассмотреть что-то как MEF, который будет заботиться о загрузке и схождении компонентов для Вас.

2
ответ дан Tim Cooper 23 November 2019 в 20:27
поделиться

Да, это, Вы захотите использовать метод статистической нагрузки на классе блока, и затем назвать тогда вызов методом CreateInstance на экземпляре блока возвращенный Вам от вызова для Загрузки.

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

1
ответ дан casperOne 23 November 2019 в 20:27
поделиться

Вы можете делать это следующим образом:

using System.Reflection;

Assembly MyDALL = Assembly.Load("DALL"); //DALL name of your assembly
Type MyLoadClass = MyDALL.GetType("DALL.LoadClass"); // name of your class
 object  obj = Activator.CreateInstance(MyLoadClass);
0
ответ дан 23 November 2019 в 20:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: