我已经从.dll加载了一个窗体,它正确显示,我可以执行在.dll中创建的方法。
注意Form1窗口中的文本标签。在我的主窗口中,我单击调试然后选择一个应该将文本标签更改为另一个字符串的选项。但是字符串拒绝改变。我已经检查过Form1中的方法是否正在触发,并且label.text已被更改,但显示从未改变。
注意:这也适用于我测试的其他控件(文本框/列表框等)。
public void Command(string cmd, string param1, string param2, string param3)
{
if (cmd == "TEST")
{
this.label1.Text = "This should now change";
MessageBox.Show("DONE");
}
}
MessageBox按预期显示,label.text已更改,所有事件都正确触发(我为标签创建了一个单击事件),看起来标签实际上并没有更新。我也试过在标签上使用Refresh。
如果可能的话还有一个问题,:)是否有一种特殊的方法可以在主表单上创建一个可以提供给Form1的回调?我认为某种代表?
我以这种方式从dll加载
try
{
Type interfaceType = typeof(IPlugin);
// Fetch all the types that implement the interface IPlugin and are a class
Type[] types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass)
.ToArray();
foreach (Type type in types)
{
// Create a new instance of all found types
PluginLists.All.Add((IPlugin)Activator.CreateInstance(type));
Console.WriteLine("Plugin loaded: {0}", type.ToString());
}
Console.WriteLine("Plugins loaded: {0}", PluginLists.All.Count);
}
并且,每个dll都实现了一个启动表单的方法
public void Plugin_Start(DockPanel _dockPanel)
{
//
var miscForm = new frmMiscellaneousTest();
miscForm.Show(_dockPanel, DockState.DockRight);
}
感谢您提供任何帮助,非常感谢。
答案 0 :(得分:0)
我使用下面的代码(现在已注释掉)来显示表单,但我完全忘记了我已经在表单中并且不需要再次实例化它:(
public void Plugin_Start()
{
//
this.Show();
//var MiscForm = new frmMiscellaneousTest();
//MiscForm.Show();
}