Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由Process.Start()启动的应用程序是';不要争论_C#_Process.start_Processstartinfo - Fatal编程技术网

C# 由Process.Start()启动的应用程序是';不要争论

C# 由Process.Start()启动的应用程序是';不要争论,c#,process.start,processstartinfo,C#,Process.start,Processstartinfo,使用C#,我尝试使用process.Start()将命令行参数传递给新进程: 我的C应用程序Demo.exe只是回显命令行参数: int main( int argc, char *argv[] ) { int count=0; // Display each command-line argument. printf( "\nCommand-line arguments:\n" ); for( count = 0; count < argc; count++

使用C#,我尝试使用process.Start()将命令行参数传递给新进程:

我的C应用程序Demo.exe只是回显命令行参数:

int main( int argc, char *argv[] )
{
   int count=0;

   // Display each command-line argument.
    printf( "\nCommand-line arguments:\n" );
    for( count = 0; count < argc; count++ )
        printf( "  argv[%d]   %s\n", count, argv[count] );

    while(1);
}
使用C#应用程序时,唯一得到的是argv[0]处的path参数:

Command-line arguments:
  argv[0]   C:
任务管理器显示启动Demo.exe的每个方法的命令行参数:

为什么我的C应用程序没有从C#应用程序接收命令行参数

编辑 @hvd建议我使用GetCommandLine()。以下是代码和结果:

char* ar = GetCommandLine();
printf( "\nGetCommandLine arguments:\n" );
printf("  %s", ar);
输出:

GetCommandLine arguments:
  "C:
是否有可能C应用程序将参数作为一个字符串接收,但忽略路径中第一个\之后的所有内容

编辑:我在下面添加了一个答案。这是一个解决办法,但我不确定问题的原因。

试试这个

Arguments = "\"arg1\" \"arg2\" \"arg3\"";

我今天又回到这里,有一个解决办法。我不明白为什么我最初的尝试没有成功

下面是在命令行中键入Demo.exe和“Demo.exe”之间的区别

C:\Users\me\Desktop\Work\Builds\Win32>Demo.exe one two three
There are 4 arguments.
Command-line arguments:
argv[0]: Demo.exe
argv[1]: one
argv[2]: two
argv[3]: three

C:\Users\me\Desktop\Work\Builds\Win32>"Demo.exe" one two three
There are 1 arguments.
Command-line arguments:
argv[0]: Demo.exe
Process.Start()调用似乎在执行“Demo.exe”类型

不起作用:

ProcessStartInfo startInfo = new ProcessStartInfo
{
   FileName = @"Demo.exe",
   WorkingDirectory = @"C:\Users\me\Desktop\Work\Builds\Win32",
   Arguments = "one two three"
 };
 var process = Process.Start(startInfo);

There are 1 arguments.
Command-line arguments:
argv[0]: C:
是否有效:

ProcessStartInfo startInfo = new ProcessStartInfo
{
   FileName = "cmd.exe",
   WorkingDirectory = @"C:\Users\me\Desktop\Work\Builds\Win32",
   Arguments = "/C Demo.exe one two three"
 };
 var process = Process.Start(startInfo);
There are 4 arguments.
Command-line arguments:
argv[0]: Demo.exe
argv[1]: one
argv[2]: two
argv[3]: three

有人知道为什么第一种方法不起作用吗

我能够重现你的问题。我没有访问C,所以我在Visual Studio 2013中使用C++。似乎C#usingStartInfo将参数作为Unicode字符传递,因此第一个字节为非零,而第二个字节可能为0位,因此仅显示第一个字符,因为这表示字符串终止字符。当我使用printf时,它不起作用,我必须使用tprintf来查看传递了什么。printf不处理Unicode。printf不仅不能处理它,而且在填充argv时,您的C程序不会将Unicode转换为使用1字节字符的字符串。虽然C++中的Tchar(宽char)和tPrTrf都是C,n/p> 因此,当您以另一种方式执行此操作时,使用“cmd.exe”调用“/C Demo.exe一两三”cmd没有将字符串作为Unicode传递。这是我的假设,考虑到我得到的结果

关于堆栈溢出的相关问题

C++代码,正确显示参数<强>(TPRETCF)>和不正确<强>(PrtTf)<强> < /P> 仅出于信息目的,C#调用C#也有效。同样令人怀疑的原因是C#正在将参数作为Unicode字符传递给您的C程序

作为编程目标的C#代码称为

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            foreach (string arg in args)
            {
                i++;
                Console.WriteLine("Argument {0}: {1}", i, arg);
            }
            Console.ReadLine();
        }

    }
}

请出示您的C#代码。@JonSkeet C#在上面的第一个代码框中。您还想看其他内容吗?感谢您在此问题中提供了大量信息,这些信息可用于查找问题。当您使用cmd.exe运行此进程时,您是否从与C#应用程序中的应用程序路径相同的目录中执行此操作?我感觉你的C#应用程序无法看到或读取C:\Demo目录。我先用你的代码启动了一个C#控制台应用程序,它显示的参数很好。然后我使用了C++控制台应用程序,它只显示了每个参数的第一个字母,就像你调用的GeCudidLink()中的“C”。然后我意识到,它可能是某种Unicode问题,所以我把我的C++从Prtf改成了TyTrf,以在数组中正确显示Unicode,这就是它对我的作用。当您执行printf时,它将读取第一个字节并显示正确的第一个字符,但下一个字节是0(UTF),因此它认为它是字符串的结尾,因为0为空。不知道第三个解决方案为什么有效,但它确实。。。调用cmd.exe并传递/C somefile.exe somearguments对我也适用。
ProcessStartInfo startInfo = new ProcessStartInfo
{
   FileName = "cmd.exe",
   WorkingDirectory = @"C:\Users\me\Desktop\Work\Builds\Win32",
   Arguments = "/C Demo.exe one two three"
 };
 var process = Process.Start(startInfo);
There are 4 arguments.
Command-line arguments:
argv[0]: Demo.exe
argv[1]: one
argv[2]: two
argv[3]: three
#include "stdafx.h"
#include "string.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int count=0;

    // Display each command-line argument.
    printf( "\nCommand-line arguments:\n" );
    for( count = 0; count < argc; count++ )
        //Correct. This statement worked, displaying the arguments
        //_tprintf( _T("  argv[%d]   %s\n"), count, argv[count] );

        //Incorrect. Displayed only the first character of each argument
        //printf( "  argv[%d]   %s\n", count, argv[count] );

    getchar();
    return 0;
}
namespace ProcessPassArguments
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Temp\Demo.exe";
                    string arguments = "one two three";
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                FileName = path,
                Arguments = arguments
            };
            var process = Process.Start(startInfo);
        }
    }
}
namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            foreach (string arg in args)
            {
                i++;
                Console.WriteLine("Argument {0}: {1}", i, arg);
            }
            Console.ReadLine();
        }

    }
}