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

本文关键字:控制台 应用程序 隐藏 Invoke 运行 使用 | 更新日期: 2023-09-27 18:28:53

在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.ProcessWindowStyle.Hidden',因为进程不在磁盘中。

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

我能想到两种解决方案:

1.将控制台应用程序输出类型从Console Application更改为Windows Application。您可以将其从Project Properties更改。这将隐藏控制台窗口。

2.将程序集字节写入文件并使用Process.Start隐藏控制台窗口。类似这样的东西:

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

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

请参阅如何确定给定.NET程序集使用的子系统?以讨论如何检测作为控制台的应用程序。