C# 使用Invoke运行隐藏的控制台应用程序

C# 使用Invoke运行隐藏的控制台应用程序,c#,.net,C#,.net,在C#程序中,我使用“Invoke”方法直接在内存中执行包含另一个.NET控制台应用程序的byte[],代码如下: static void Main(string[] args) { byte[] Bytes = File.ReadAllBytes("C:\\test.exe"); Assembly a = Assembly.Load(FileBytes); MethodInfo m = a.EntryPoint; var parameters = m.GetParameters().

在C#程序中,我使用“Invoke”方法直接在内存中执行包含另一个.NET控制台应用程序的byte[],代码如下:

static void Main(string[] args)
{
 byte[] Bytes = File.ReadAllBytes("C:\\test.exe");

 Assembly a = Assembly.Load(FileBytes);
 MethodInfo m = a.EntryPoint;
 var parameters = m.GetParameters().Length == 0 ? null : new[] { new string[0] };
 m.Invoke(null, parameters);
}
然而,由于我在内存中启动的控制台应用程序(“C:\test.exe”)永远不会结束(它使用了一个while-forever循环),因此黑色的cmd窗口永远不会消失


如何执行它?现在我不能使用例如
“System.Diagnostics.processWindowsStyle.Hidden”
,因为进程不在磁盘中。

在OP的情况下,他们已经澄清,他们可以修改正在加载的程序集的源。在这种情况下,您应该能够将应用程序设置为GUI应用程序,这将阻止控制台窗口被打开


有关如何在控制台中检测应用程序的讨论,请参阅。

我可以想出两种解决方案:

1.将控制台应用程序输出类型从
控制台应用程序
更改为
Windows应用程序
。您可以从
项目属性
更改它。这将隐藏控制台窗口

2.将程序集字节写入文件并使用进程。开始隐藏控制台窗口。大概是这样的:

var f = Path.GetTempFileName() + ".exe";
File.WriteAllBytes(f, assemblyBytes);
var p = new Process();
p.StartInfo.FileName = f;
p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
p.Start();

您正在启动,而不是午餐:)在这里您还可以看到关于创建Windows服务或从其中启动此代码的内容,您不会看到控制台window@eddie_cat我没有午餐:(lol抱歉我的英语不好=PIs这是不是有一个原因,你不只是使用
进程
?是的,因为使用进程控制台应用程序必须在磁盘上,但我需要它直接在内存上运行。因为我不能触摸磁盘,所以我使用了你的第一个解决方案,它成功了。再次感谢!)谢谢你的回答,这也应该有效,很遗憾,我只能奖励1个答案。