Отображение формы из динамически загружаемой библиотеки 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

Следует добавить другую проверку/обработку ошибок; однако, по крайней мере, я гарантирую, что конверсия будет работать.