2017-10-20 35 views
-1

Ci-dessous est juste un exemple de la fonctionnalité.Comment démarrer un fichier .exe avec une chaîne json comme paramètre correctement?

J'ai un modèle comme celui-ci:

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

A partir d'une application WPF. Je sérialisation comme JSON comme ceci:

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

var jsonStartParams = JsonConvert.SerializeObject(startParams); 

Je suis le lancement d'un fichier .exe avec la chaîne JSON en tant que paramètre.

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

Process.Start(info); 

En FILE.EXE J'ai une tâche qui prend une chaîne:

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

Lorsque le débogage, je peux appeler la méthode principale statique dans FILE.EXE comme ceci:

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

Cela fonctionne comme un charme, mais dès que j'appelle le fichier .exe avec Process.Start, avec le paramètre de chaîne JSON, il échoue avec

Newtonsoft.Json.JsonReaderException

à la première hélice dans l'objet JSON.

Quelqu'un peut-il me diriger dans la bonne direction d'une solution?

Merci!

+0

Je ne pense pas que vous devriez essayer de faire cela. Il est très difficile d'échapper correctement une chaîne de commande Windows. La réponse ci-dessous ne va pas aider. Au lieu de cela, enregistrez la chaîne JSON dans un fichier TEMP et utilisez le nom de fichier comme paramètre - ou placez-le dans le fichier .exe via stdin – Jacob

Répondre

1

Les citations de jsonStartParams font l'argument séparé en plusieurs arguments. Essayez d'échapper les citations comme ceci:

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

Cela a fonctionné, je savais que c'était possible. – Kristian

-1

Vous avez probablement besoin d'échapper à la chaîne JSON

quelque chose comme ça

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

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

Merci pour votre réponse. J'ai juste essayé ça. N'a pas résolu le problème. – Kristian

+0

Non recommandé. Json peut être plein de caractères spéciaux avec une signification, comme & | |> Jacob