使用反射崩溃调用Windows表单Show()方法



我有以下类(暴露于com),我用作包装器,以显示vb6的表格。

public class NetForm : INetForm
{
    public NetForm(Assembly assembly, string name, object[] parameters)
    {
        Assembly = assembly;
        Name = name;
        CreateInstance(parameters);
    }
    private Assembly Assembly { get; set; }
    private string Name { get; set; }
    private Form Instance { get; set; }
    private void CreateInstance(object[] parameters)
    {
        Type type = Assembly.GetType(Name);
        Type[] types = new Type[parameters.Length];
        for (int idx = 0; idx < parameters.Length; idx++)
            types[idx] = parameters[idx].GetType();
        ConstructorInfo ci = type.GetConstructor(types);
        Instance = (Form)ci.Invoke(parameters);
    }
    public void Show()
    {
        Instance.Visible = true;
        Instance.Show();       // Crashing
    }
    public void ShowDialog()
    {
        Instance.ShowDialog();  // Works perfectly
    }
}
public class NetAssembly
{
    public NetAssembly(string fullname)
    {
        Init(fullname);
    }
    private Assembly Assembly { get; set; }
    private void Init(string name)
    {
        Assembly = Assembly.LoadFrom(name);            
    }
    public NetForm GetForm(string nameSpace, string name, object[] parameters)
    {
        name = string.Concat(nameSpace, ".", name);
        return new NetForm(Assembly, name,parameters);
    }
}
  1. Showdialog()效果很好。
  2. 如果可见属性未设置为true,则不会显示show()。但是,当将其设置为true时,该表单在几秒钟后部分显示并崩溃。

我正在使用UnitTestProject进行检查:

[TestClass]
public class NetFormUnitTest
{
    [TestMethod]
    public void ShowTestMethod()
    {
        var assembly = new NetAssembly(assemblyFullName);
        var form = assembly.GetForm(nameSpace, formName, new object[] { "Item1" });
        form.Show();
    }
}

调用show()方法的正确方法是什么?

您的表格需要消息泵(例如 application.run 创建)。Showdialog的原因是它创建了自己的消息循环。

因此,添加Application.Run(formInstance)应该解决问题。

最新更新