收到密码提示C#System.Diagnostic.Process的通知

收到密码提示C#System.Diagnostic.Process的通知,c#,command-line,process,C#,Command Line,Process,我一直试图使用System.Diagnostic.Process在git可执行文件周围实现一个C#包装器,但遇到了一些麻烦。我想做的是在与远程存储库交互时,每当git提示输入用户名和密码时,在我的应用程序中弹出一个密码提示。这将允许用户自动使用所有内置的git密码凭证存储工具,并且仍然可以在应用程序中输入未使用的凭证 我尝试的是以下代码 var process = new System.Diagnostics.Process(); process.StartInfo.UseShellE

我一直试图使用System.Diagnostic.Process在git可执行文件周围实现一个C#包装器,但遇到了一些麻烦。我想做的是在与远程存储库交互时,每当git提示输入用户名和密码时,在我的应用程序中弹出一个密码提示。这将允许用户自动使用所有内置的git密码凭证存储工具,并且仍然可以在应用程序中输入未使用的凭证

我尝试的是以下代码

var process = new System.Diagnostics.Process();

    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.FileName = "cmd.exe";
    process.StartInfo.Arguments = "/c git fetch";

    StringBuilder output = new StringBuilder();
    StringBuilder error = new StringBuilder();

    process.OutputDataReceived += (sender, e) =>
    {
        Debug.Log("OUTPUT DATA: " + e.Data);
    };
    process.ErrorDataReceived += (sender, e) =>
    {
        Debug.Log("ERROR DATA: " + e.Data);
    };

    process.Start();

    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    process.WaitForExit();
我看到命令窗口弹出“Password for:”,但我在OutputDataReceived或ErrorDataReceived回调中都没有看到此输出,以供我的应用程序读取。理想情况下,我希望在出现这些提示时触发一个事件,并为用户显示一个漂亮的用户名/密码对话框


我仔细研究了一下git代码,发现这些密码提示是输出到/dev/tty并从中读取的。现在我不太熟悉输入/输出流和TTY的工作原理。我想知道是否有人能为我指出正确的方向,让我知道何时会弹出此提示,并允许用户进入

Aha。我找到了答案。我可以制作一个小型GUI应用程序,git通过设置“git config core.askpass”在需要密码时提示我

我使用下面的askpass脚本进行了测试,它可以根据需要正常工作


为什么要用参数
/c git fetch
调用
cmd.exe
,而不仅仅是用参数
fetch
调用
git.exe
?也可能有帮助。对不起,这只是我在尝试的事情。我最初把它设置为只调用“git”“然后又回到了那一点。不过,无论哪种方式,我都会有同样的行为。谢谢你的链接,但这不是我真正想要的。我想让git问我用户名。我只是希望用户能够在git提示的情况下指定用户名,我完全知道我想做的事情可能根本不可能。在这种情况下,我将研究在我的应用程序中构建我自己的密码缓存机制。我想如果git已经内置了一个非常健壮的密码缓存API,为什么还要重新发明它呢?如果用户愿意,我应该让他们充分利用这一点,并且只允许他们在git无法从他们自己的凭据API中找到密码时输入密码。