我不确定如何说出这个问题所以请耐心等待。
我正在创建一个沙箱来运行具有不同权限的.exes。基本上我是建立在本文中的示例:https://msdn.microsoft.com/en-us/library/bb763046(v=vs.110).aspx
在我重新设计之前,我的项目有一个控制台应用程序输出类型(Project-> Properties-> Application-> Output type),尽管它主要是WPF项目。这导致控制台窗口和我的GUI在程序开始时显示。
在沙盒中运行控制台应用程序时,输出将写入已打开的控制台窗口,而不是创建另一个与测试中的.exe相关联的窗口。我试图避免这种情况,并希望我的输出类型保留为Windows应用程序,以防止打开不必要的控制台窗口。
据我所知,问题源于这一行代码:
target.EntryPoint.Invoke(null, parameters);
这会在我测试的.exe中运行Main(string[] args)
方法,但是它不会产生自己的控制台窗口,并且会很快出错。有没有办法创建一个控制台窗口并将生成的进程附加到它?
谢谢,编辑和问题欢迎
P.S。将输出类型设置为控制台应用程序,其他输出类型(例如表单和wpf项目)可以非常好地加载它们各自的GUI。
答案 0 :(得分:0)
我的问题的答案涉及使用pInvoke以使用一些kernal32 api。添加这些DLLImports:
[DllImport("kernel32.dll")]
static extern int AllocConsole();
[DllImport("kernel32.dll")]
static extern int FreeConsole();
这些允许我将一个控制台分配给我即将启动的进程,我可以将我的项目作为Windows应用程序。所有需要发生的事情是将我的调用包含在Alloc和Free之间。
因此:
AllocConsole();
var trythis = target.EntryPoint.Invoke(null, parameters);
FreeConsole();