Tag: stdout

从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 […]

在不编写文件的情况下在Python和C#之间传递数据

我想在Python和C#之间传递二进制信息。 我假设您可以打开一个标准的输入/输出通道,并像文件一样读写,但是有很多可移动的部分,而且我不太了解C#。 我想做这种事情,但不写文件。 # python code with open(DATA_PIPE_FILE_PATH, ‘wb’) as fid: fid.write(blob) subprocess.Popen(C_SHARP_EXECUTABLE_FILE_PATH) with open(DATA_PIPE_FILE_PATH, ‘rb’) as fid: ‘Do stuff with the data’ // C# code static int Main(string[] args){ byte[] binaryData = File.ReadAllBytes(DataPipeFilePath); byte[] outputData; // Create outputData File.WriteAllBytes(outputData) 我已经尝试了几种使用标准输入/输出的不同方法,但我没有运气匹配它们,就像我说的那样,有许多活动部件。 我尝试过类似的东西 p = subprocess.Popen(C_SHARP_EXECUTABLE_FILE_PATH, stdin=subprocess.PIPE, stdout=subprocess.PIPE) p.stdin.write(blob) p.stdin.close() 要么 p = subprocess.Popen(C_SHARP_EXECUTABLE_FILE_PATH, stdin=subprocess.PIPE, stdout=subprocess.PIPE) […]

如何将数据从托管程序集流式传输到本机库并再次返回?

如何将数据(文本)从托管程序集流式传输到本机库并将数据(文本)流式传输回托管程序集? 具体来说,我想在.NET端公开某种类型的System.IO.Stream ,并且( 最重要的是 )在本机端公开一个FILE * 。 本机方法的签名应该是: FILE * foo(FILE * bar); 本机p / invoke调用的包装签名应该是: CustomStream foo(CustomStream bar); 我不想在本机端使用回调方法 (一个用于获取更多数据,一个用于设置更多数据)。 我想在本机端使用FILE * – 以及对其进行操作的所有相关方法,例如fprintf 。 我不想要任何磁盘I / O. 这需要是内存中的操作。 我完全控制托管程序集和本机库。 该解决方案必须与.NET 2.0一起使用 我愿意创建任何类型的托管或非托管填充层来实现这一目标。 “显而易见”的解决方案是使用STDIN和STDOUT并启动子进程 – 但是我不想要一个单独的进程。 此外,我尝试重定向本机库的STDIN和STDOUT流,而这些流不是Windows上的控制台应用程序,但它的失败程度有些惊人(并且有很多头脑冲击)。 基于这个问题: 在C#Windows服务上重定向stdout + stderr我试图修改方法(至少)解决问题的一半“响应”流 – 但是没有FileStream (因为我想要一些类似于MemoryStream东西) )。 但是, FileStream是唯一公开合适的低级流句柄的流类型。 否则,我已经陷入困境,而且我现在正在考虑我需要深入研究并提出我自己的手动本地托管流实现,但实际上并不知道从哪里开始。 解 最后! 我在这里发布了一个完整的示例项目: http://pastebin.com/jcjHdnwz 这适用于.NET 3.5并使用AnonymousPipeServerStream […]

如何保存控制台应用程序的输出

我需要建议如何让我的C#控制台应用程序通过标准输出向用户显示文本,同时仍然可以在以后访问它。 我想实现的实际function是在程序执行结束时将整个输出缓冲区转储到文本文件中。 我使用的解决方法,虽然我找不到更清晰的方法是子类TextWriter重写写入方法,所以他们都会写入文件并调用原始的stdout编写器。 像这样的东西: public class DirtyWorkaround { private class DirtyWriter : TextWriter { private TextWriter stdoutWriter; private StreamWriter fileWriter; public DirtyWriter(string path, TextWriter stdoutWriter) { this.stdoutWriter = stdoutWriter; this.fileWriter = new StreamWriter(path); } override public void Write(string s) { stdoutWriter.Write(s); fileWriter.Write(s); fileWriter.Flush(); } // Same as above for WriteLine() and WriteLine(string), // plus whatever […]

无法将命令发送到cmd.exe进程

我正在尝试使用StandardInput.WriteLine(str)将命令发送到打开的cmd.exe进程,但是似乎没有发送任何命令。 首先,我使用全局变量p( Process p )打开一个过程。 p = new Process() { StartInfo = { CreateNoWindow = true, UseShellExecute = false, RedirectStandardError = true, RedirectStandardInput = true, RedirectStandardOutput = true, FileName = @”cmd.exe”, Arguments = “/C” //blank arguments } }; p.Start(); p.WaitForExit(); 之后,我尝试使用一种简单的方法发送命令,该方法将结果记录在文本框中。 private void runcmd(string command) { p.StandardInput.WriteLine(command); var output = p.StandardOutput.ReadToEnd(); TextBox1.Text = output; } […]

如何在进程操作期间逐行捕获进程STDOUT和STDERR。 (C#)

我将执行一个进程(lame.exe)将WAV文件编码为MP3。 我想处理进程的STDOUT和STDERR以显示进度信息。 我需要使用线程吗? 我无法理解它。 一些简单的示例代码将不胜感激。 谢谢

以正确的顺序捕获进程stdout和stderr

我从C#启动一个进程如下: public bool Execute() { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.Arguments = “the command”; startInfo.FileName = “C:\\MyApp.exe”; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; Log.LogMessage(“{0} {1}”, startInfo.FileName, startInfo.Arguments); using (Process myProcess = Process.Start(startInfo)) { StringBuilder output = new StringBuilder(); myProcess.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e) { Log.LogMessage(Thread.CurrentThread.ManagedThreadId.ToString() + e.Data); }; myProcess.ErrorDataReceived += delegate(object […]

将子进程的输出(stdout,stderr)重定向到Visual Studio中的“输出”窗口

目前我从我的C#程序启动一个批处理文件: System.Diagnostics.Process.Start(@”DoSomeStuff.bat”); 我希望能够做的是将该子进程的输出(stdout和stderr)重定向到Visual Studio中的Output窗口(特别是Visual C#Express 2008)。 有没有办法做到这一点? (另外:这样就不会全部缓冲,然后在子进程完成时吐出到Output窗口。) (顺便说一句:目前我可以通过使我的程序成为“Windows应用程序”而不是“控制台应用程序”来获得出现在“输出”窗口中的父进程的stdout(但不是stderr)。如果程序运行,这会中断在Visual Studio之外,但在我的特定情况下这是可以的。)

当StartInfo.RedirectStandardInput设置为true时,为什么StandardOutput.Read()会阻塞?

我很难解密关于Process.StandardOutpout的MSDN文档, 看看 Read(Char [],Int32,Int32)方法是否阻塞。 我的理解是它不应该阻塞,但是当我将RedirectStandardInput设置为true时似乎就是这样。 有没有人有这方面的经验; 或者对我遇到的问题有一些解释? 这里的上下文是我不想等待一个完整的行(即使用行终止符),或者在读取标准输出之前退出进程。 另外我不想使用回调。 我希望在进程写入时同步读取StdOut。 这是我的代码的简化版本: string command = @”C:\flex_sdks\flex_sdk_4.5.1.21328\bin\fcsh.exe”; Process p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = false; # 0); if (sb_stdout.ToString().EndsWith(“\n(fcsh) “)) break; Thread.Sleep(20); } 更新 基于我(可能是坏的)假设Process.StandardOutput在使用时被破坏: 与stdin重定向; 和, 从stdout或stderr读取除终止行之外的其他内容, 我决定直接尝试使用Windows的API。 我用这样的代码添加了答案; 它工作正常(至少现在)。 另一个更新 我用我现在使用的代码创建了一个博客条目 。