在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 while循环),黑色cmd窗口永远不会消失。
如何隐藏执行?现在我不能使用例如'System.Diagnostics.ProcessWindowStyle.Hidden'
,因为进程不在磁盘中。
答案 0 :(得分:0)
在OP的案例中,他们澄清说他们可以修改正在加载的程序集的来源。在这种情况下,您应该能够将应用程序设置为GUI应用程序,这将阻止打开控制台窗口。
有关如何检测作为控制台的应用程序的讨论,请参阅How can I determine the subsystem used by a given .NET assembly?。
答案 1 :(得分:0)
我可以想到两个解决方案:
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();