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

Возможно ли создать экземпляр объекта во время выполнения, если у меня есть только имя DLL и имя classа без добавления ссылки на сборку в проекте? Класс реализует интерфейс, поэтому, как только я создам экземпляр classа, я затем передам его в интерфейс.

Название сборки:

Library.dll

Имя типа:

Company.Project.Classname


EDIT: У меня нет абсолютного пути к DLL, поэтому Assembly.LoadFile не будет работать. DLL может быть в корне приложения, system32 или даже загружена в GAC.

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

 Assembly assembly = Assembly.LoadFrom("MyNice.dll"); Type type = assembly.GetType("MyType"); object instanceOfMyType = Activator.CreateInstance(type); 

Обновить

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

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

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

Более подробную информацию о контекстах загрузки можно найти в документах LoadFrom .

Activator.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); } 

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

Первое решение:

 string assemblyName = "library.dll"; string assemblyPath = HttpContext.Current.Server.MapPath("~/bin/" + assemblyName); Assembly assembly = Assembly.LoadFrom(assemblyPath); Type T = assembly.GetType("Company.Project.Classname"); Company.Project.Classname instance = (Company.Project.Classname) Activator.CreateInstance(T); 

Второе решение

 string assemblyName = "library.dll"; string assemblyPath = HttpContext.Current.Server.MapPath("~/bin/" + assemblyName); Assembly assembly = Assembly.LoadFile(assemblyPath); (Company.Project.Classname) instance = (Company.Project.Classname) assembly.CreateInstance("Company.Project.Classname"); 

Вы можете использовать тот же принцип для интерфейсов (вы бы создали class, но листинг для интерфейса), например:

 (Company.Project.Interfacename) instance = (Company.Project.Interfacename) assembly.CreateInstance("Company.Project.Classname"); 

Этот пример предназначен для веб-приложения, но аналогичный может быть использован для настольного приложения, только путь разрешен по-разному, например

 Path.GetDirectoryName(Application.ExecutablePath) 

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

Тем временем, эта ссылка должна начать:

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

 ((ISomeInterface)Activator.CreateInstance(Assembly.LoadFile("somePath").GetTypes()[0])).SomeInterfaceMethod(); 

Вы можете загрузить сборку, используя методы * Assembly.Load **. Используя Activator.CreateInstance, вы можете создавать новые экземпляры нужного типа. Имейте в виду, что вы должны использовать полное имя типа classа, который хотите загрузить (например, Namespace.SubNamespace.ClassName ). Используя метод InvokeMember classа Type, вы можете вызывать методы типа.

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

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

Начиная с Framework v4.5 вы можете использовать Activator.CreateInstanceFrom (), чтобы легко создавать classы в assemblyх. В следующем примере показано, как его использовать и как вызвать метод, передающий параметры, и получение возвращаемого значения.

  // Assuming moduleFileName contains full or valid relative path to assembly var moduleInstance = Activator.CreateInstanceFrom(moduleFileName, "MyNamespace.MyClass"); MethodInfo mi = moduleInstance.Unwrap().GetType().GetMethod("MyMethod"); // Assuming the method returns a boolean and accepts a single string parameter bool rc = Convert.ToBoolean(mi.Invoke(moduleInstance.Unwrap(), new object[] { "MyParamValue" } )); 

Это просто.

Пример из MSDN:

 public static void Main() { // Use the file name to load the assembly into the current // application domain. Assembly a = Assembly.Load("example"); // Get the type to use. Type myType = a.GetType("Example"); // Get the method to call. MethodInfo myMethod = myType.GetMethod("MethodA"); // Create an instance. object obj = Activator.CreateInstance(myType); // Execute the method. myMethod.Invoke(obj, null); } 

Вот ссылка

https://msdn.microsoft.com/en-us/library/25y1ya39.aspx

Да, вы захотите использовать статический метод Load в classе Assembly, а затем вызовите, затем вызовите метод CreateInstance в экземпляре Assembly, возвращенный вам из вызова Load.

Кроме того, вы можете вызвать один из других статических методов, начиная с «Загрузить» в classе Assembly, в зависимости от ваших потребностей.

 Assembly assembly = Assembly.LoadFrom("MyAssembly.dll"); Type type = assembly.GetType("MyType"); dynamic instanceOfMyType = Activator.CreateInstance(type); 

Таким образом, вы можете использовать функции не с получением методаinfo, а затем вызывать его. Вы будете делать как этот экземплярOfMyType.MethodName (); Но вы не можете использовать Intellisense, потому что динамические типы вводятся во время выполнения, а не во время компиляции.

Вы можете сделать так:

 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); 
  • Как загрузить сборку .NET для операций отражения и впоследствии выгрузить ее?
  • C #: зачем подписывать сборку?
  • Как сохранить сборки ASP.NET в AppDomain в живых?
  • Безопасно ли читать конец конца буфера на одной странице на x86 и x64?
  • Почему медленная инструкция цикла? Не удалось ли Intel эффективно внедрить его?
  • Есть ли альтернатива Maven или порт для мира .NET?
  • Как я могу перечислить все загруженные сборки?
  • Как скомпилировать и запустить программу C в Sublime Text 2?
  • Как вы прокручиваете загруженные в настоящее время сборки?
  • Проверьте, равен ли регистр нулю с помощью CMP reg, 0 против OR reg, reg?
  • Сколько циклов процессора требуется для каждой инструкции сборки?
  • Interesting Posts

    Причина появления UAC из командной строки без специальных инструментов

    Как фильтровать мое интернет-соединение на основе контента?

    Лучший способ добавить «текущий» class к навигации в Rails 3

    Клиент удаленного рабочего стола в Windows 7 Full Screen Issue

    Что такое группа методов в C #?

    Папки обновлений Windows (со странными именами) на диске C

    Как напечатать строку с нулевым завершением с помощью printf?

    Повторяющиеся ошибки множественного определения от включения одного и того же заголовка в нескольких cpps

    почему remove-migration запускает мое приложение?

    Поддерживается ли constexpr с lambda-функциями / выражениями?

    SQL Pivot от бедного человека. Список вопросов как столбцов и ответов на пользователя в одной строке

    Создание веб-службы WCF с помощью запросов GET

    Можно ли проверить MP3 на повреждение данных?

    Android ICS и MJPEG с использованием AsyncTask

    Конфликт с зависимостью «com.android.support:support-annotations». Разрешенные версии для приложения (23.1.0) и тестового приложения (23.0.1) отличаются

    Давайте будем гением компьютера.