具有两种不同行为的 C# 方法是通过正在运行的应用程序或命令行调用的

标签 c# command-line

我想开发一种方法,当通过正在运行的应用程序调用它时,它应该打印一个列表,但是当直接通过命令行调用该方法时,我希望它将相同的列表打印到一个 txt 文件。

你们知道我如何执行此验证,或者是否有一种方法可以检测从何处调用进程?

我在 stak overflow 上找到了这篇文章,但我不知道如何解决我的问题。

C#: Is it possible to have a single application behave as Console or Windows application depending on switches?

最佳答案

您可以尝试从内核 32 函数调用中获取控制台窗口。

private const string Kernel32_DllName = "kernel32.dll";

[DllImport(Kernel32_DllName)]
private static extern IntPtr GetConsoleWindow();

public static bool HasConsole {
    get { return GetConsoleWindow() != IntPtr.Zero; }
}

如果加载了控制台,HasConsole 应返回 true,如果从窗口启动则返回 false。

如果程序是控制台应用程序,总会有一个控制台窗口打开,因此检测启动方法比较棘手。

已经有一个涵盖此问题的 SO 问题 - How can you determine how a console application was launched?

作为快速引用,下面列出了相关部分,但我建议通读该主题,因为它更清楚地解释了该过程。

static bool StartedFromGui = 
     !Console.IsOutputRedirected
  && !Console.IsInputRedirected
  && !Console.IsErrorRedirected
  && Environment.UserInteractive
  && Environment.CurrentDirectory == System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)
  && Console.CursorTop == 0 && Console.CursorLeft == 0
  && Console.Title == Environment.GetCommandLineArgs()[0]
  && Environment.GetCommandLineArgs()[0] == System.Reflection.Assembly.GetEntryAssembly().Location;

关于具有两种不同行为的 C# 方法是通过正在运行的应用程序或命令行调用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31875323/

相关文章:

c# - 为什么我需要初始化字符串变量 'name' ?

c# - 列出文件夹中的所有文件 - 文件的完整路径

linux - 如何使用 find 重命名不同目录中的同名文件

vb.net - 从 vb.net 中的命令行获取参数

linux - 如何在新的 Linux 安装中更改我的用户名(光标左侧的名称)?

c# - 进行通用 MVC API 查询

c# - 将控件/UIElement 可见性正确且正确地绑定(bind)到 Property MVVM C#​​ WPF

c# - 如何对这个 C# 扩展方法进行单元测试?

user-interface - 命令行SSH远程服务器管理器的UI客户端

command-line - 必须仅使用一行来调用 PowerShell 脚本吗?