- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
out.txt 运行它,但我想使用 Visual Stu-6ren">
我正在尝试将 C# 程序的输出重定向到一个文件。使用“cmd.exe”时,我可以简单地使用 myprogram.exe arg1 arg2 > out.txt
运行它,但我想使用 Visual Studio Start Options
.
我创建了一个C# 空项目并添加了这段代码:
using System;
class Test
{
public static void Main(string[] args)
{
foreach (var arg in args) Console.WriteLine(arg);
}
}
然后我在项目设置中编辑了命令行参数:
使用 Ctrl+F5 运行项目无法按预期运行。我在控制台而不是输出文件中打印了命令行参数:
arg1
arg2
>
output.txt
如果我将命令行参数更改为:arg1 arg2 "> output.txt"
我会得到以下输出:
arg1
arg2
^> output.txt
我注意到在 Output 文件夹中创建了一个空的 output.txt
文件。
这件事有可能完成还是我被迫继续使用 cmd.exe 来启动我的程序?
最佳答案
从严格意义上讲,您被迫使用命令提示符启动带有重定向输出的程序。否则,您需要自己解析命令行,GUI shell 可能不会这样做。
如果您只是想在 Start Debugging
时重定向输出,然后取消选中 Enable the Visual Studio hosting process
复选框,您就完成了。
如果您没有这样做,那么您在那里看到的 "output.txt"
实际上不是由您的应用程序生成的,而是"YourApplication.vshost.exe"
是在您开始调试之前由 Visual Studio IDE 生成的。内容永远是空的,不能写;因为它被 Hosting Process 锁定了.
但是,如果您希望应用程序无论以何种模式启动都表现得一样,事情就更复杂了。
当您开始调试应用程序时,它开始于:
"YourApplication.exe" arg1 arg2
因为输出已经被 IDE 重定向了。
当你Start Without Debugging
时,它开始于:
"%comspec%" /c ""YourApplication.exe" arg1 arg2 ^>output.txt & pause"
这是让您的应用程序获取您指定的所有参数的正确方法。
您可能想看看我之前对 How can I detect if "Press any key to continue . . ." will be displayed? 的回答.
这里我使用了类似 atavistic throwback 的方法在下面的代码中:
申请代码
using System.Diagnostics;
using System.Linq;
using System;
class Test {
public static void Main(string[] args) {
foreach(var arg in args)
Console.WriteLine(arg);
}
static Test() {
var current=Process.GetCurrentProcess();
var parent=current.GetParentProcess();
var grand=parent.GetParentProcess();
if(null==grand
||grand.MainModule.FileName!=current.MainModule.FileName)
using(var child=Process.Start(
new ProcessStartInfo {
FileName=Environment.GetEnvironmentVariable("comspec"),
Arguments="/c\x20"+Environment.CommandLine,
RedirectStandardOutput=true,
UseShellExecute=false
})) {
Console.Write(child.StandardOutput.ReadToEnd());
child.WaitForExit();
Environment.Exit(child.ExitCode);
}
#if false // change to true if child process debugging is needed
else {
if(!Debugger.IsAttached)
Debugger.Launch();
Main(Environment.GetCommandLineArgs().Skip(1).ToArray());
current.Kill(); // or Environment.Exit(0);
}
#endif
}
}
我们还需要下面的代码,这样它才能工作:
扩展方法代码
using System.Management; // add reference is required
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System;
public static partial class NativeMethods {
[DllImport("kernel32.dll")]
public static extern bool TerminateThread(
IntPtr hThread, uint dwExitCode);
[DllImport("kernel32.dll")]
public static extern IntPtr OpenThread(
uint dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
}
public static partial class ProcessThreadExtensions /* public methods */ {
public static void Abort(this ProcessThread t) {
NativeMethods.TerminateThread(
NativeMethods.OpenThread(1, false, (uint)t.Id), 1);
}
public static IEnumerable<Process> GetChildProcesses(this Process p) {
return p.GetProcesses(1);
}
public static Process GetParentProcess(this Process p) {
return p.GetProcesses(-1).SingleOrDefault();
}
}
partial class ProcessThreadExtensions /* non-public methods */ {
static IEnumerable<Process> GetProcesses(
this Process p, int direction) {
return
from format in new[] {
"select {0} from Win32_Process where {1}" }
let selectName=direction<0?"ParentProcessId":"ProcessId"
let filterName=direction<0?"ProcessId":"ParentProcessId"
let filter=String.Format("{0} = {1}", p.Id, filterName)
let query=String.Format(format, selectName, filter)
let searcher=new ManagementObjectSearcher("root\\CIMV2", query)
from ManagementObject x in searcher.Get()
let process=
ProcessThreadExtensions.GetProcessById(x[selectName])
where null!=process
select process;
}
// not a good practice to use generics like this;
// but for the convenience ..
static Process GetProcessById<T>(T processId) {
try {
var id=(int)Convert.ChangeType(processId, typeof(int));
return Process.GetProcessById(id);
}
catch(ArgumentException) {
return default(Process);
}
}
}
因为在我们调试时,父级将是 Visual Studio IDE(当前名为 "devenv"
)。父进程和祖父进程实际上是多种多样的,我们需要一个规则来执行一些检查。
棘手的部分 是真正遇到Main
的是孙子。代码在每次运行时检查祖父进程。如果祖 parent 是 null
那么它会产生,但产生的进程将是 %comspec%
,这也是它将以相同的可执行文件启动的新进程的父进程当前。因此,如果祖 parent 与自己相同,那么它就不会继续生成,只会遇到 Main
。
Static Constructor在代码中使用,在Main
之前启动。 SO 上有一个已回答的问题:How does a static constructor work? .
当我们开始调试时,我们正在调试祖父进程(产生)。为了使用孙子进程进行调试,我制作了带有条件编译的 Debugger.Launch
,它将调用 Main
,以保持 Main
清晰。
有关调试器的已回答问题也会有所帮助:Attach debugger in C# to another process .
关于c# - 如何使用 Visual Studio "command line arguments"选项将 C# 项目的标准输出重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16262394/
我正在使用 NetBeans 开发 Java 中的 WebService,并使用 gradle 作为依赖管理。 我找到了this article关于使用 gradle 开发 Web 项目。它使用 Gr
我正在将旧项目从 ant 迁移到 gradle(以使用其依赖项管理和构建功能),并且在生成 时遇到问题>eclipse 项目。今天的大问题是因为该项目有一些子项目被拆分成 war 和 jar 包部署到
我已经为这个错误苦苦挣扎了很长时间。如果有帮助的话,我会提供一些问题的快照。请指导我该怎么办????在我看来,它看起来一团糟。 *** glibc detected *** /home/shivam/
我在 Ubuntu 12.10 上运行 NetBeans 7.3。我正在学习 Java Web 开发类(class),因此我有一个名为 jsage8 的项目,其中包含我为该类(class)所做的工作。
我想知道 Codeplex、GitHub 等中是否有任何突出的项目是 C# 和 ASP.NET,甚至只是 C# API 与功能测试 (NUnit) 和模拟(RhinoMocks、NMock 等)。 重
我创建了一个 Maven 项目,包装类型为“jar”,名为“Y”我已经完成了“Maven 安装”,并且可以在我的本地存储库中找到它.. 然后,我创建了另一个项目,包装类型为“war”,称为“X”。在这
我一直在关注the instructions用于将 facebook SDK 集成到我的应用程序中。除了“helloFacebookSample”之外,我已经成功地编译并运行了所有给定的示例应用程序。
我想知道,为什么我们(Java 社区)需要 Apache Harmony 项目,而已经有了 OpenJDK 项目。两者不是都是在开源许可下发布的吗? 最佳答案 事实恰恰相反。 Harmony 的成立是
我正在尝试使用 Jsoup HTML Parser 从网站获取缩略图 URL我需要提取所有以 60x60.jpg(或 png)结尾的 URL(所有缩略图 URL 都以此 URL 结尾) 问题是我让它在
我无法构建 gradle 项目,即使我编辑 gradle 属性,我也会收到以下错误: Error:(22, 1) A problem occurred evaluating root project
我有这个代码: var NToDel:NSArray = [] var addInNToDelArray = "Test1 \ Test2" 如何在 NToDel:NSArray 中添加 addInN
如何在单击显示更多(按钮)后将主题列表限制为 5 个(项目)。 还有 3(项目),依此类推到列表末尾,然后它会显示显示更少(按钮)。 例如:在 Udemy 过滤器选项中,当您点击查看更多按钮时,它仅显
如何将现有的 Flutter 项目导入为 gradle 项目? “导入项目”向导要求 Gradle 主路径。 我有 gradle,安装在我的系统中。但是这里需要设置什么(哪条路径)。 这是我正在尝试的
我有一个关于 Bitbucket 的项目。只有源被提交。为了将项目检索到新机器上,我在 IntelliJ 中使用了 Version Control > Checkout from Ve
所以,我想更改我公司的一个项目,以使用一些与 IDE 无关的设置。我在使用 Tomcat 设置 Java 应用程序方面有非常少的经验(我几乎不记得它是如何工作的)。 因此,为了帮助制作独立于 IDE
我有 2 个独立的项目,一个在 Cocos2dx v3.6 中,一个在 Swift 中。我想从 Swift 项目开始游戏。我该怎么做? 我已经将整个 cocos2dx 项目复制到我的 Swift 项目
Cordova 绝对是新手。这些是我完成的步骤: checkout 现有项目 运行cordova build ios 以上生成此构建错误: (node:10242) UnhandledPromiseR
我正在使用 JQuery 隐藏/显示 li。我的要求是,当我点击任何 li 时,它应该显示但隐藏所有其他 li 项目。当我将鼠标悬停在文本上时 'show all list item but don
我想将我所有的java 项目(223 个项目)迁移到gradle 项目。我正在使用由 SpringSource STS 团队开发的 Gradle Eclipse 插件。 目前,我所有的 java 项目
我下载this Eclipse Luna ,对于 Java EE 开发人员,如描述中所见,它支持 Web 应用程序。我找不到 file -> new -> other -> web projects
我是一名优秀的程序员,十分优秀!