从动态加载的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()设置表单的布局,这个太长了,无法在此处粘贴,不应该有所作为。

有任何想法吗?

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

 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) 

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

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

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

如果类属于FormAssembly.GetType()返回NULL 。 如果一个类属于User Control那么我可以看到返回的类型。

语法也应如下:

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

哪里

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

我会选择:

 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 

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