Отображение формы из динамически загружаемой библиотеки DLL
Это расширение вопроса, который я ранее задал здесь.
Короче говоря, я динамически загружаю DLL и вывожу из него type
следующим кодом:
Assembly assembly = Assembly.LoadFile("C:\\test.dll");
Type type = assembly.GetType("test.dllTest");
Activator.CreateInstance(type);
Оттуда я могу использовать type
для ссылки практически на что-либо в классе dllTest
. Класс по умолчанию при запуске должен вызывать форму (в данном случае довольно пустую, поэтому она не сложна).
Я чувствую, что здесь отсутствует ключевая строка кода, которая сохраняет форму от загрузки на экране.
dllTest.cs
(внутри DLL) состоит из:
namespace test
{
public partial class dllTest : Form
{
public dllTest()
{
InitializeComponent();
}
}
}
InitializeComponent()
устанавливает макет формы, который слишком длинный для вставки здесь и не должен иметь значения.
Любые идеи?
Ответы
Ответ 1
Вам нужно что-то сделать с формой, которую вы только что создали:
Assembly assembly = Assembly.LoadFile("C:\\test.dll");
Type type = assembly.GetType("test.dllTest");
Form form = (Form)Activator.CreateInstance(type);
form.ShowDialog(); // Or Application.Run(form)
Ответ 2
Да, вы на самом деле не указываете, какой код запускается за пределами инициализатора класса. Например, с формами, которые вы должны показывать на самом деле.
Вы можете изменить свой код на следующий...
Assembly assembly = Assembly.LoadFile("C:\\test.dll");
Type type = assembly.GetType("test.dllTest");
Form form = Activator.CreateInstance(type) as Form;
form.ShowDialog();
Ответ 3
Если класс принадлежит Form
, то Assembly.GetType()
возвращает NULL
.
Если класс принадлежит User Control
, то я вижу, что тип возвращается.
Также синтаксис должен быть таким:
Type type = assembly.GetType("Assemblytest.clsTest");
где
-
clsTest
будет именем класса (пользовательского элемента управления)
-
Assemblytest
- это имя сборки без расширения .dll.
Ответ 4
Я бы пошел с:
Assembly assembly = Assembly.LoadFile("C:\\test.dll");
Type type = assembly.GetType("test.dllTest");
object obj = Activator.CreateInstance(type);
Form form = obj as Form;
if (form != null)
form.Show(); //or ShowDilaog() whichever is needed
Следует добавить другую проверку/обработку ошибок; однако, по крайней мере, я гарантирую, что конверсия будет работать.