【问题标题】:Parse json string provided as Process Start Info Arguments for exe C#解析作为 exe C# 的进程启动信息参数提供的 json 字符串
【发布时间】:2019-02-22 14:09:40
【问题描述】:

您好,我有一个需要从另一个 exe 执行的应用程序。当我作为命令行参数传递时,相同的 json 字符串可以正常工作;但是当我将它作为 Process Start Info Arguments 传递时失败。

命令行参数:

输入(即 args[0]):"{\"mydllpath\":\"D:\\dll\",\"FilePath\":\"D:\\Input\\abc.doc\", \"Attribute\":\"word\"}"

Console.Writeline:{"mydllpath":"D:\\dll","FilePath":"D:\\Input\\abc.doc", "Attribute":"word"}

解析成功

进程启动信息参数:

输入:"{\"mydllpath\":\"D:\\dll\",\"FilePath\":\"D:\\Input\\abc.doc\", \"Attribute\":\"word\"}"

Console.Writeline:{"mydllpath":"D:\dll","FilePath":"D:\Input\abc.doc", "Attribute":"word"}

解析失败:解析值时遇到意外字符:D.

ProcessStartInfo psi = new ProcessStartInfo("D:\\ETS\\AE\\bin\\Debug\\AE.exe");
string json = "{\"mydllpath\":\"D:\\dll\",\"FilePath\":\"D:\\Input\\abc.doc\", \"Attribute\":\"word\"}";
psi.Arguments = json;
Process p = new Process();
Debug.WriteLine(psi.FileName + " " + psi.Arguments);
p.Start();
p.StartInfo = psi;

【问题讨论】:

  • 包括用于进行进程调用的代码。
  • 为了澄清,代码中的上述JSON,你为什么要转义路径中的斜杠?
  • 它在没有转义序列的情况下给出错误

标签: c# process arguments


【解决方案1】:

传递的参数没有被正确转义

应该正确转义

var jsonString = "{\"mydllpath\":\"D:\dll\",\"FilePath\":\"D:\Input\abc.doc\", \"Attribute\":\"word\"}";
var args = string.Format("\"\"\"{0}\"\"\"", jsonString);
psi.Arguments = args;
//...

参考ProcessStartInfo.Arguments Property

【讨论】:

  • 错误!! “错误的 JSON 转义序列”
  • @sina123 好的,我将删除我的 cmets 并更新答案,以便您了解我的意思。
  • 它仍然在VS编辑器中给出错误“无法识别的转义序列”
  • @sina123 当您提到VS编辑器错误时,您是指运行时错误还是语法错误?这应该更像是一个语法错误
  • @sina123 看看下面的文档docs.microsoft.com/en-us/dotnet/api/…
【解决方案2】:

唯一对我有用的是转换为base64,然后再转换回来

string args = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(request)));

            using (Process process = new Process())
            {
               process.StartInfo = new ProcessStartInfo()
               {
                  FileName = Assembly.GetExecutingAssembly().Location,
                  Arguments = args,
                  UseShellExecute = false,
                  CreateNoWindow = true
               };

               process.Start();
               process.WaitForExit(timeoutSeconds * 1000);
            }
byte[] bytes = Convert.FromBase64String(args);
         string requestStr = System.Text.Encoding.UTF8.GetString(bytes);
         ReportRequest request = JsonConvert.DeserializeObject<ReportRequest>(requestStr);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2012-11-23
    • 2023-03-12
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多