这是我之前提出的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()
设置表单的布局,这个版本太长了,无法在此处粘贴,不应该有所作为。
有什么想法吗?
答案 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
应添加其他错误检查/处理;但至少我会确保转换有效。