从动态加载的DLL中显示表单

时间:2009-07-06 17:53:45

标签: c# dll forms

这是我之前提出的here问题的扩展。

长话短说,我使用以下代码动态加载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()设置表单的布局,这个版本太长了,无法在此处粘贴,不应该有所作为。

有什么想法吗?

4 个答案:

答案 0 :(得分:14)

您必须对刚刚创建的表单执行某些操作:

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)

答案 1 :(得分:3)

是的,您实际上并未指定在类初始化程序之外运行的任何代码。例如,对于表单,您必须实际显示它们。

您可以将代码修改为以下内容......

Assembly assembly = Assembly.LoadFile("C:\\test.dll");
Type type = assembly.GetType("test.dllTest");
Form form = Activator.CreateInstance(type) as Form;
form.ShowDialog();

答案 2 :(得分:1)

如果某个类属于Form,则Assembly.GetType()会返回NULL。 如果一个类属于User Control,那么我可以看到该类型被返回。

语法也应如下:

Type type = assembly.GetType("Assemblytest.clsTest");

其中

  • clsTest将是(用户控件的)类的名称
  • Assemblytest是没有.dll扩展名的汇编名称。

答案 3 :(得分:0)

我会选择:

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

应添加其他错误检查/处理;但至少我会确保转换有效。