Можно ли создать экземпляр объекта во время выполнения, если у меня есть только имя DLL и имя класса, без добавления ссылки на сборку в проекте? Класс реализует интерфейс, поэтому, как только я создам экземпляр класса, я приведу его к интерфейсу.
Название сборки:
Library.dll
Введите имя:
Company.Project.Classname
РЕДАКТИРОВАТЬ: У меня нет абсолютного пути к DLL, поэтому Assembly.LoadFile
не будет работать. DLL может находиться в корне приложения, system32 или даже загружаться в GAC.
источник
Type type = assembly.GetType("MyNamespace"+"."+"MyType");
Рассмотрим ограничения различных
Load*
методов. Из документов MSDN ...Более подробную информацию о контекстах загрузки можно найти в
LoadFrom
документации.источник
Activator.CreateInstance должен работать.
Примечание: имя типа должно быть полностью определенным типом.
Пример:
источник
TypeName
поводу : должно быть полностью квалифицированным. Я должен был назвать это как:Activator.CreateInstance("MyAssembly","MyAssembly.TypeName")
И это возвращаетObjectHandle
. Чтобы перейти к вашему интерфейсу, вам нужно сделатьObjectHandle.UnWrap()
Я нашел этот вопрос и некоторые ответы очень полезными, однако у меня были проблемы с путями, поэтому этот ответ охватывал бы загрузку библиотеки путем нахождения пути к каталогу bin.
Первое решение:
Второе решение
Вы можете использовать тот же принцип для интерфейсов (вы будете создавать класс, но приведение к интерфейсу), например:
Этот пример относится к веб-приложению, но подобное можно использовать и для настольных приложений, иначе разрешается только путь, например
источник
Это просто.
Пример из MSDN:
Вот ссылка ссылка
https://msdn.microsoft.com/en-us/library/25y1ya39.aspx
источник
Начиная с Framework v4.5, вы можете использовать Activator.CreateInstanceFrom (), чтобы легко создавать экземпляры классов в сборках. В следующем примере показано, как его использовать и как вызывать метод, передавая параметры и получая возвращаемое значение.
источник
Да. У меня нет никаких примеров, которые я сделал лично, прямо сейчас. Я выложу позже, когда найду. В основном вы будете использовать отражение, чтобы загрузить сборку, а затем вытащить любые типы, которые вам нужны.
А пока эта ссылка должна помочь вам начать:
Использование отражения для загрузки сборок без ссылок во время выполнения
источник
источник
Вы можете загрузить сборку, используя методы * Assembly.Load **. Используя Activator.CreateInstance вы можете создавать новые экземпляры нужного вам типа. Помните, что вы должны использовать полное имя типа класса, который вы хотите загрузить (например, Namespace.SubNamespace.ClassName ). Использование метода InvokeMember от типа класса вы можете вызывать методы типа.
Кроме того, примите во внимание, что после загрузки сборка не может быть выгружена до тех пор, пока не будет выгружен весь домен приложений (в основном это утечка памяти).
источник
В зависимости от того, насколько эта функциональность присуща вашему проекту, вы можете рассмотреть что-то вроде MEF, которое позаботится о загрузке и связывании компонентов для вас.
источник
Таким образом, таким образом вы можете использовать функции, не получая methodinfo, а затем вызывая его. Вам будет делать это instanceOfMyType.MethodName (); Но вы не можете использовать Intellisense, потому что динамические типы вводятся во время выполнения, а не во время компиляции.
источник
Да, вам нужно использовать статический метод Load в классе Assembly, а затем вызвать, а затем вызвать метод CreateInstance для экземпляра Assembly, возвращенного вам из вызова Load.
Кроме того, вы можете вызывать один из других статических методов, начиная с «Load» в классе Assembly, в зависимости от ваших потребностей.
источник
Вы можете сделать это следующим образом:
источник