我有以下类(暴露于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);
}
}
- Showdialog()效果很好。
- 如果可见属性未设置为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)
应该解决问题。