Tag: io redirection

从C#调用者中的非托管DLL捕获stdout

我有一个C#应用程序通过一些C ++ / CLI编组代码调用本机C ++ DLL: C# – > C ++ / CLI – > C ++(无CLR) 我希望DLL在运行时将字符串更新发回给调用应用程序。 目前,非托管DLL将输出写入stdout。 基本上我需要在UI中捕获此输出。 在我正在炮轰非托管exe的其他情况下,这可以通过简单地将stdout从被调用者重定向到绑定到文本面板的UI数据中的字符串缓冲区来实现。 我没有选择使用P / Invoke调用DLL或将其作为exe来shell,因为互操作层执行非基本类型的基本编组。 非托管DLL没有CLR支持,必须保持这种方式。 我使用代表( http://msdn.microsoft.com/en-us/library/367eeye0(v=vs.100).aspx )取得了有限的成功,因为似乎总是存在托管和非托管世界发生冲突的地方。 以链接中的示例为例,将来自C ++ / CLI伪装的托管委托作为本机函数指针传递给DLL,但回调是在C ++ / CLI类的范围之外定义的,因此无法访问从中传入的托管委托。调用层(C#)。 理想情况下,我想定义一个接受非托管字符串的类,并可以将这些字符串转换为托管并回调到UI层,但如果此类具有托管字符串的必要支持,则无法将其传递给非托管代码。 我可能错过了一个简单的重定向技巧,它允许捕获stdout而不在层之间传递字符串(例如,从通过委托接收的C ++ / CLI重定向stdout)。 如果这是不可能的,任何人都可以提出替代技术吗? 托管C ++: using namespace System::Runtime::InteropServices; using namespace System; namespace BusinessObjectInterop { typedef void (__stdcall […]

在已运行的控制台应用程序内运行交互式进程,无需打开新窗口

我意识到这看起来像很多其他问题,但我看了几个小时都没看过,我从未找到我需要的真正答案,所以请听我说: 这适用于.NET C#控制台应用程序。 在其中,我想使用Process.Start调用Windows可执行文件,但是在运行时没有打开新的控制台窗口 。 我还希望可执行文件能够输出到控制台并正常响应用户输入。 你怎么做到这一点? 设置ProcessStartInfo.CreateNoWindow或ProcessStartInfo.WindowStyle ? 尝试使输入/输出重定向工作数小时? 编辑: smh ……这与那里的“可能的重复”不同,因为: 这适用于想要在自身内无缝运行Windows命令的控制台应用程序,就好像该命令是控制台应用程序本身的一部分一样。 例如:创建一个新的C#控制台应用程序并使其运行Windows copy命令。 另外,我需要用户能够与正在运行的命令交互 (例如,如果copy询问是否覆盖我希望用户回答),那么隐藏窗口就像这样 ,或者这个可能的答案是禁止的。 我想强调单个 UseShellExecute属性如何解决问题,在这样的答案中没有误导性的绒毛(例如,关于I / O重定向),或者这再次让我浪费时间。

可重复输入过程的标准输入

我有一个(C#)控制台应用程序,它维护一个状态。 通过控制台向应用程序提供各种输入,可以更改状态。 我需要能够通过一点输入来提供应用程序,然后读取输出冲洗并重复。 我创建了一个新进程,并完成了重定向输入/输出的所有正常工作。 问题是,在我发送输入并在标准输出上调用ReadLine()之后,它在标准输入上调用Close()之前不返回值,之后我不能再写入输入流了。 如何在仍然接收输出的同时保持打开输入流? var process = new Process { StartInfo = { FileName = @”blabal.exe”, RedirectStandardInput = true, RedirectStandardError = true, RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true, ErrorDialog = false } }; process.EnableRaisingEvents = false; process.Start(); var standardInput = process.StandardInput; standardInput.AutoFlush = true; var standardOutput = process.StandardOutput; var standardError […]

重定向控制台应用程序的标准输入

我有一个控制台应用程序,我试图通过重定向过程的标准输入流自动化。 在打开应用程序后的手动模式下,它等待用户输入,如下所示, 我使用重定向的标准输入流创建了该过程。代码片段如下, Process newProcess = new Process(); newProcess.StartInfo.FileName = exeName; newProcess.StartInfo.Arguments = argsLine; newProcess.StartInfo.UseShellExecute = false; newProcess.StartInfo.RedirectStandardOutput = false ; newProcess.StartInfo.CreateNoWindow = false; newProcess.StartInfo.RedirectStandardInput = true; newProcess.Start(); 但是创建这样的过程会产生如下所示的无限循环, 这就像我将Enter键命令连续发送到过程输入流。 谁能指出我在这里做错了什么? 同样,标准输出流重定向在制作后也不起作用 newProcess.StartInfo.RedirectStandardOutput = true 但我可以解决这个问题。 标准流的重定向是否适用于所有控制台应用程序,或者是否有任何exception?