C# 在NUnit Mono中运行命令行参数

C# 在NUnit Mono中运行命令行参数,c#,macos,xamarin,mono,nunit,C#,Macos,Xamarin,Mono,Nunit,我在OSX上使用Xamarin 6.0.1、mono 4.4.1和NUnit 3.4.1来运行运行命令行参数的类库类 “部署哪个ios”。直接在终端上返回:“/usr/local/bin/ios deploy” 然而,在我的应用程序中,该命令返回“/usr/bin/which” 关于如何让应用程序返回终端返回的内容,有什么想法吗 请参阅下面的代码,谢谢您的想法 public class ProcesRunner { public string getProcess() {

我在OSX上使用Xamarin 6.0.1、mono 4.4.1和NUnit 3.4.1来运行运行命令行参数的类库类

“部署哪个ios”。直接在终端上返回:“/usr/local/bin/ios deploy”

然而,在我的应用程序中,该命令返回“/usr/bin/which”

关于如何让应用程序返回终端返回的内容,有什么想法吗

请参阅下面的代码,谢谢您的想法

public class ProcesRunner
{

    public string getProcess()
    {
        ProcessStartInfo p = new ProcessStartInfo("/usr/bin/which", "which ios-deploy");
        p.CreateNoWindow = true;
        p.RedirectStandardOutput = true;
        p.RedirectStandardError = true;
        p.UseShellExecute = false;
        Process pg = new Process();
        pg.StartInfo = p;
        pg.Start();
        string strOutput = pg.StandardOutput.ReadToEnd();
        string strError = pg.StandardError.ReadToEnd();
        Console.WriteLine(strError);
        pg.WaitForExit();
        return strOutput;
    }
}
单元测试

[TestFixture()]
   public class Test
   {
    [Test()]
    public void TestCase()
    {
        ProcesRunner pr = new ProcesRunner();
        string outvar = pr.getProcess();
        Console.WriteLine(outvar);
    }
}

更新:由于您在Xamarin Studio/MonoDevelop中运行了测试,所以刚刚从您的评论中意识到这一点

当在一个本身未被赋予shell环境的应用程序中启动
进程时,即您单击图标启动它,而不是从cli启动它,您需要告诉您的进程作为登录shell运行(
manbash
了解详细信息),以便运行bash配置文件并选择路径设置,等等

-l     Make  bash  act  as if it had been invoked as a login shell
替换:

ProcessStartInfo p = new ProcessStartInfo("/usr/bin/which", "which ios-deploy");
与:

输出:

nunit-console -nologo bin/Debug/WhichTest.dll
.
/usr/local/bin/ios-deploy


Tests run: 1, Failures: 0, Not run: 0, Time: 0.049 seconds

更新:由于您在Xamarin Studio/MonoDevelop中运行了测试,所以刚刚从您的评论中意识到这一点

当在一个本身未被赋予shell环境的应用程序中启动
进程时,即您单击图标启动它,而不是从cli启动它,您需要告诉您的进程作为登录shell运行(
manbash
了解详细信息),以便运行bash配置文件并选择路径设置,等等

-l     Make  bash  act  as if it had been invoked as a login shell
替换:

ProcessStartInfo p = new ProcessStartInfo("/usr/bin/which", "which ios-deploy");
与:

输出:

nunit-console -nologo bin/Debug/WhichTest.dll
.
/usr/local/bin/ios-deploy


Tests run: 1, Failures: 0, Not run: 0, Time: 0.049 seconds
替换

ProcessStartInfo p = new ProcessStartInfo("/usr/bin/which", "which ios-deploy");

您正在将
哪个
传递到
哪个
这就是您看到
哪个
路径的原因:)

编辑

如果从参数中删除
哪个
会导致一个空字符串,那么很可能是因为
ios部署
在您的用户路径上。您可能需要设置
p.LoadUserProfile=true
,并且可能需要升级到NUnit 3.4.1并使用命令行选项
--LoadUserProfile
。按照查理的建议,它应该会起作用

请参见更换

ProcessStartInfo p = new ProcessStartInfo("/usr/bin/which", "which ios-deploy");

您正在将
哪个
传递到
哪个
这就是您看到
哪个
路径的原因:)

编辑

如果从参数中删除
哪个
会导致一个空字符串,那么很可能是因为
ios部署
在您的用户路径上。您可能需要设置
p.LoadUserProfile=true
,并且可能需要升级到NUnit 3.4.1并使用命令行选项
--LoadUserProfile
。按照查理的建议,它应该会起作用



请参见

在流程完成之前捕获输出。您需要在WaitForExit之后移动这些行。

在流程完成之前捕获输出。您需要在WaitForExit之后移动这些行。

不幸的是,它不起作用,在调试模式下,strOutput为空。谢谢你的建议。@mogoli Strange,你的代码和我的更改对我有用。。。。cmd行上的
/bin/bash-c“哪个ios部署”
是否没有返回ios部署的完整路径?真奇怪,请问您使用的是哪个版本的Xamarin、Nunit和Mono?该命令直接在终端上工作。Nunit 3.4.1和2.4.8控制台运行程序,Mono 4.4.0,XS版本6.1(build 4963)。将UseShellExecute设置为false引用:不幸的是,它不工作,在调试模式下,strOutput为空。谢谢你的建议。@mogoli Strange,你的代码和我的更改对我有用。。。。cmd行上的
/bin/bash-c“哪个ios部署”
是否没有返回ios部署的完整路径?真奇怪,请问您使用的是哪个版本的Xamarin、Nunit和Mono?该命令直接在终端上工作。Nunit 3.4.1和2.4.8控制台运行程序,Mono 4.4.0,XS版本6.1(build 4963)。将UseShellExecute设置为假引用:ProcessStartInfo p=new ProcessStartInfo(“/usr/bin/which”,“ios deploy”);返回一个空字符串。不幸的是,它没有打印ios部署的路径。感谢您的建议,我已经添加了有关使用
LoadUserProfile
的信息。问题似乎在于在xamarin ide中运行测试。当我从终端运行测试时,它工作。WeirdProcessStartInfo p=newProcessStartInfo(“/usr/bin/which”,“ios部署”);返回一个空字符串。不幸的是,它没有打印ios部署的路径。感谢您的建议,我已经添加了有关使用
LoadUserProfile
的信息。问题似乎在于在xamarin ide中运行测试。当我从终端运行测试时,它工作。古怪的pg.Start();pg.WaitForExit();字符串strOutput=pg.StandardOutput.ReadToEnd();字符串strError=pg.StandardError.ReadToEnd();感谢您的建议pg.Start();pg.WaitForExit();字符串strOutput=pg.StandardOutput.ReadToEnd();字符串strError=pg.StandardError.ReadToEnd();谢谢你的建议