.net 为我的应用程序获取交互式控制台的最简单方法

.net 为我的应用程序获取交互式控制台的最简单方法,.net,powershell,.net-4.0,console-application,user-interaction,.net,Powershell,.net 4.0,Console Application,User Interaction,我想用一种简单、交互式的方式演示我的应用程序的中间层功能,这些功能还没有创建UI。我想要一个互动控制台 当我的应用程序(WPF,但这不重要)启动时,我也想启动一个控制台窗口。此窗口应运行powershell(或ruby或python,但最好是powershell),并将其范围设置为访问我的ServiceLocator 或者,我可以启动我的应用程序,从外部powershell窗口连接到process appdomain,并获取对ServiceLocator的引用。这可能吗 无论如何,我以前创建过I

我想用一种简单、交互式的方式演示我的应用程序的中间层功能,这些功能还没有创建UI。我想要一个互动控制台

当我的应用程序(WPF,但这不重要)启动时,我也想启动一个控制台窗口。此窗口应运行powershell(或ruby或python,但最好是powershell),并将其范围设置为访问我的ServiceLocator

或者,我可以启动我的应用程序,从外部powershell窗口连接到process appdomain,并获取对ServiceLocator的引用。这可能吗

无论如何,我以前创建过IronRuby引擎并在作用域中设置了变量,但如果我这样做,我需要创建自己的控制台输入/显示机制


有人知道更好的方法吗?

我越来越喜欢Visual Studio的即时窗口,在那里我可以在调试时简单地键入分配或调用函数。它显然不是您想要的,但如果您或其他读者不知道,它肯定非常有用。

我越来越喜欢Visual Studio的即时窗口,在那里我可以在调试时简单地键入任务或调用函数。这显然不是您想要的,但如果您或其他读者不知道,它肯定非常有用。

任何Windows应用程序都可以通过调用Windows
AllocConsole
API函数来创建控制台。不幸的是,.NET控制台类没有公开该功能。几年前,我写了一系列文章和一些代码来扩展.NET控制台界面,包括
alloconsole
支持。不幸的是,DevSource似乎丢失了该系列的第一篇文章

以下是您需要的两个函数:

[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool AllocConsole();

[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool FreeConsole();

您可以从我的网站下载完整的扩展控制台支持包:

任何Windows应用程序都可以通过调用Windows
AllocConsole
API函数来创建控制台。不幸的是,.NET控制台类没有公开该功能。几年前,我写了一系列文章和一些代码来扩展.NET控制台界面,包括
alloconsole
支持。不幸的是,DevSource似乎丢失了该系列的第一篇文章

以下是您需要的两个函数:

[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool AllocConsole();

[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool FreeConsole();

您可以从我的网站下载完整的扩展控制台支持包:

看看这篇文章:

看看这篇文章:

特写了对Iron Python团队的Jimmy Schementi的采访,他在Silverlight中谈到了IronPython交互式DLR控制台。这里是演示站点:

特写了对Iron Python团队的Jimmy Schementi的采访,他在Silverlight中谈到了Iron Python交互式DLR控制台。这里是演示站点:

您可以使用PowerShell的
控制台shell

比如:

using System.Management.Automation;
using System.Management.Automation.Runspaces;
...
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
runspaceConfiguration.Cmdlets.Append(...);
ConsoleShell.Start(runspaceConfiguration, Console.Title, Console.Title, new string[] { });
...
这将在您的流程中启动PowerShell,您可以访问变量、添加与应用程序交互的cmdlet等。
ConsoleShell为您提供了输入/输出机制,包括选项卡完成和命令行界面的其他功能。

您可以使用PowerShell的
ConsoleShell

比如:

using System.Management.Automation;
using System.Management.Automation.Runspaces;
...
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
runspaceConfiguration.Cmdlets.Append(...);
ConsoleShell.Start(runspaceConfiguration, Console.Title, Console.Title, new string[] { });
...
这将在您的流程中启动PowerShell,您可以访问变量、添加与应用程序交互的cmdlet等。
ConsoleShell为您提供了输入/输出机制,包括制表符完成和命令行界面的其他功能。

是的,它很好,但名称空间很麻烦,在应用程序运行时您无法使用它,因此您无法执行启动windows之类的操作。事实上,我只是想找到一个ServiceLocator的参考。当前的,它不起作用是的,它的好东西,但名称空间是一个麻烦,你不能在应用程序运行时使用它,所以你不能做像启动windows这样的事。事实上,我只是试图获取对ServiceLocator.Current和它不起作用的引用,我还没有完全阅读它,但这似乎与WCF有关。我的是一个桌面应用程序-我不想设置WCF端点,我只需要访问数据库中的一个变量appdomain@George摩尔:你必须以这样或那样的方式进行某种IPC。在两个进程之间设置命名管道端点很容易。命名管道速度快,不需要桌面应用程序无法使用的任何东西,并且易于使用。这不一定是真的,控制台不需要在不同的进程中运行。不过,感谢您的建议,我将研究命名管道——我以前从未做过,也没有完全阅读过,但这似乎与WCF有关。我的是一个桌面应用程序-我不想设置WCF端点,我只需要访问数据库中的一个变量appdomain@George摩尔:你必须以这样或那样的方式进行某种IPC。在两个进程之间设置命名管道端点很容易。命名管道速度快,不需要桌面应用程序无法使用的任何东西,并且易于使用。这不一定是真的,控制台不需要在不同的进程中运行。不过,谢谢你的建议,我将研究命名管道——我以前从未这样做过当你说控制台与应用程序一起运行时,控制台内的作用域是什么?如果我没有直接为作用域注入变量,我不理解这是如何工作的。我对设置ServiceLocator的作用域涉及的所有内容都有点不清楚。我想你得想办法直接注入这些变量。对不起,我没有完全理解你的问题。是的,我可以启动一个控制台,甚至只需显式调用cmd.exe,但我不知道如何注入该变量。另一方面,将它们注入脚本非常简单,但是创建一个控制台将是一个难题当你说控制台与应用程序一起运行时,什么是t