是否可以反映整个Windows窗体应用程序?

时间:2014-01-05 15:57:25

标签: c# .net windows

编辑:问题是两个程序的Framework版本不匹配:一个使用2.0而另外两个使用4.0。以下代码完美无缺。

我试图反映整个Windows窗体应用程序,但调用入口点不起作用:要么没有任何反应,要么出现崩溃。有什么我可以做的吗?

public static void Reflect(object program)
{
    object[] objArray;
    MethodInfo entryPoint = ((Assembly)program).EntryPoint;
    MethodInfo methodInfo = entryPoint;
    if ((int)entryPoint.GetParameters().Length == 0)
    {
        objArray = null;
    }
    else
    {
        objArray = new object[] { new string[0] };
    }
    methodInfo.Invoke(null, objArray);
}

1 个答案:

答案 0 :(得分:1)

如果你的应用程序都是WinForms,那么你就不能在第一个应用程序中运行第二个应用程序,因为它是一个单线程环境(并且每个应用程序都有自己的消息泵)。

要解决此问题,您可以从另一个线程启动第二个应用程序。这样每个应用程序将在自己的线程中运行(但老实说,我不知道这是否总是有效,或者Windows是否存在其他缺点)。

这样的事情(假设你的装配还没有加载反射):

ThreadPool.QueueUserWorkItem(delegate (object state)
{
    var entryPoint = ((Assembly)program).EntryPoint;
    entryPoint.Invoke(null, new string[0]);
});

请注意,应用程序入口点(如果不是null)将始终具有相同的签名,无需检查。当然我不会使用池中的线程,但这只是一个例子。