我正在将控制台应用程序程序集从资源加载到内存流(稍后加载到字节数组)并在新线程中执行该程序集。请注意,容器程序集是标准的 Winforms。
控制台应用程序正在新线程中运行,但不可见。如果将控制台应用程序替换为 winforms 程序集,则主窗体是可见的并且可以正常工作。如果我从磁盘运行控制台应用程序作为测试,它加载正常并且可见。
有什么想法吗?
ThreadStart _thdInvoke;
Thread _thdMain;
MethodInfo _methodInfo;
截图
/* memoryStream is the console application loaded from embedded resource */
var assembly = Assembly.Load(memoryStream.ToArray());
_methodInfo = assembly.EntryPoint;
_thdInvoke = InitializeEp;
_thdMain = new Thread(_thdInvoke);
_thdMain.Start();
截图
private void InitializeEp()
{
try
{
_methodInfo.Invoke(null, null);
}
catch (Exception)
{
}
}
请注意,控制台应用程序 Main 方法已更改,因此 string[] args
已被删除。
感谢您的帮助!
最佳答案
它是“不可见的”,因为控制台窗口实际上并不存在。没有告诉操作系统创建控制台并将所有读/写重定向到它。
It appears you need to do some setup in order to create the console window for your application.
您的 Main()
正在运行,但所有对 Console
的调用都将被完全忽略并且读取不会阻塞。
我测试了您的代码并验证了您的程序应该正在运行(减去控制台窗口)。您可以通过将 void Main()
更改为 int Main()
然后返回一些数字来对此进行测试。 _methodInfo.Invoke(...)
将返回 int Main()
返回的值。
关于C# 线程 : Console application in new thread is invisible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724680/