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

时间:2014-11-03 20:24:44

标签: 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().Length == 0 ? null : new[] { new string[0] };
 m.Invoke(null, parameters);
}

但是,由于我在内存中启动的控制台应用程序(“C:\ test.exe”)永远不会结束(它使用while while循环),黑色cmd窗口永远不会消失。

如何隐藏执行?现在我不能使用例如'System.Diagnostics.ProcessWindowStyle.Hidden',因为进程不在磁盘中。

2 个答案:

答案 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();