【问题标题】:Invoking a Main() in another .exe and spawning an attached Console window在另一个 .exe 中调用 Main() 并生成附加的控制台窗口
【发布时间】:2017-02-19 18:28:42
【问题描述】:

我不知道如何表达这个问题,所以请多多包涵。

我正在创建一个沙箱来运行具有不同权限的 .exe。基本上,我是在本文中的示例基础上构建的:https://msdn.microsoft.com/en-us/library/bb763046(v=vs.110).aspx

在我要提到的重新设计之前,我的项目有一个控制台应用程序输出类型(项目->属性->应用程序->输出类型),尽管它主要是一个 WPF 项目。这导致在程序启动时同时显示控制台窗口和我的 GUI。

在沙盒中运行控制台应用程序时,输出将被写入已经打开的控制台窗口,而不是创建另一个与被测 .exe 相关联的窗口。我试图避免这种情况,并且希望我的输出类型保留为 Windows 应用程序,以防止打开不必要的控制台窗口。

据我所知,问题源于这行代码:

target.EntryPoint.Invoke(null, parameters);

这会在我正在测试的 .exe 中运行 Main(string[] args) 方法,但是它不会生成自己的控制台窗口,并且错误很快就会出现。有什么方法可以创建一个控制台窗口并将生成的进程附加到它上面吗?

感谢,欢迎编辑和提问

附:将输出类型设置为控制台应用程序后,其他输出类型(例如表单和 wpf 项目)可以很好地加载各自的 GUI。

【问题讨论】:

  • 一个进程只能有一个控制台窗口。您必须在设计中适应这一点。

标签: c# wpf console-application sandbox invoke


【解决方案1】:

我的问题的答案涉及使用 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多