2017-10-20 255 views
-1

下面只是一个功能的例子。如何以正确的json字符串作为参数启动.exe?

我有这样一个模型:

public class StartParams 
{ 
    public string ParameterOne { get; set; } 
    public string ParameterTwo { get; set; } 
    public string ParameterThree { get; set; } 
} 

从一个WPF应用程序。我序列化它作为JSON这样的:

var startParams = new StartParams 
{ 
    ParameterOne = "parameterOne", 
    ParameterTwo = "parameterTwo", 
    ParameterThree = "parameterThree" 
}; 

var jsonStartParams = JsonConvert.SerializeObject(startParams); 

然后我发起与JSON字符串作为参数的.exe文件。

ProcessStartInfo info = new ProcessStartInfo 
{ 
    Arguments = jsonStartParams, 
    FileName = "C:\\Folder\\File.exe" 
}; 

Process.Start(info); 

的file.exe我有一个任务,这需要字符串:

public static async Task DoSomething(string jsonStartParams) 
{ 
    var startParams = JsonConvert.DeserializeObject<StartParams>(jsonStartParams); 

调试时,我可以调用静态Main方法中的file.exe这样的:

string[] parameters = {jsonStartParams}; 
File.Program.Main(parameters); 

这个工程就像一个魅力,但只要我用Process.Start调用带有JSON字符串参数的.exe文件,它就会失败,并返回

Newtonsoft.Json.JsonReaderException

在JSON对象的第一支柱。

有人能请我指出一个解决方案的正确方向吗?

谢谢!

+0

我不认为你应该试图做到这一点。正确地转义Windows命令字符串非常困难。下面的答案不会有帮助。相反,将JSON字符串保存为TEMP文件并将文件名用作参数 - 或者通过标准输入将它传入.exe – Jacob

回答

1

在jsonStartParams的报价正在分成多个参数的参数。尝试逃避这样的报价:

ProcessStartInfo info = new ProcessStartInfo 
{ 
    Arguments = "\"" + jsonStartParams.Replace("\"", "\\\"") + "\"", 
    FileName = "C:\\Folder\\File.exe" 
}; 
+0

这使它工作。我知道这是可能的。谢谢! – Kristian

-1

你可能需要逃避JSON字符串

像这样

JsonSerializerSettings settings = new JsonSerializerSettings 
{ 
    StringEscapeHandling = StringEscapeHandling.EscapeHtml 
}; 

var jsonStartParams = JsonConvert.SerializeObject(startParams, settings); 
+0

感谢您的回答。刚刚尝试过。没有解决问题。 – Kristian

+0

不推荐。 Json可以充满具有含义的特殊字符,如“|><”等。对于命令行参数,所有这些都需要以特殊方式进行转义,只是转义引号不能可靠地修复。是一个绝对的方法来添加&参数是一样糟糕。 – Jacob