我试图反映整个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);
}
答案 0 :(得分:1)
如果你的应用程序都是WinForms,那么你就不能在第一个应用程序中运行第二个应用程序,因为它是一个单线程环境(并且每个应用程序都有自己的消息泵)。
要解决此问题,您可以从另一个线程启动第二个应用程序。这样每个应用程序将在自己的线程中运行(但老实说,我不知道这是否总是有效,或者Windows是否存在其他缺点)。
这样的事情(假设你的装配还没有加载反射):
ThreadPool.QueueUserWorkItem(delegate (object state)
{
var entryPoint = ((Assembly)program).EntryPoint;
entryPoint.Invoke(null, new string[0]);
});
请注意,应用程序入口点(如果不是null
)将始终具有相同的签名,无需检查。当然我不会使用池中的线程,但这只是一个例子。