2012-04-04 3 views
1

Мне нужно передать список строк в качестве параметра в консольное приложение (разработанное на C#). Консольное приложение запускается с System.Diagnostics.Process.Start как:Передать список строк в качестве параметра для консольного приложения

string fname = "testDoc"; 
List<string> myList; //initialized elsewhere 

Process console = Process.Start("Client.exe", "-filename:"+fname+ " -list:"+myList); 

Как я могу добиться этого?

+0

Просто из любопытства. Сколько данных (длина байта) содержится в вашем списке? – Steve

+0

Список содержит названия документов в форме: «GUID_fileName.pdf». О длине байта, который я не знаю, я должен посмотреть на это, так как названия будут отличаться друг от друга. – Francesco

+1

Я спросил, потому что есть определенный предел для аргументов командной строки длина – Steve

ответ

3

Запуск

Process console = Process.Start("Client.exe", "-filename:" + fname + " -list:" + myList) 

выполнит myList.ToString() и будет переводить:

Client.exe -filename:testDoc -list:System.Collections.Generic.List`1[System.String] 

, который не то, что вы хотите достичь. Попробуйте

Process console = Process.Start("Client.exe", "-filename:" + fname + " -list:" + String.Join(",", myList)) 

или что-то подобное.

UPDATE

Конечно, вы можете рассмотреть некоторые более цивилизованные методы передачи данных для этого процесса. Обычные способы включают в себя:

  • база
  • файловой системы (файлы)
  • WCF

UPDATE

Учитывая контекст поставляется в комментарии, я выбрал бы для полностью автономная служба Windows, работающая на сервере (без остановки, не вызываемая) с базой данных, используемой для синхронизации:

  • база данных с таблицей Tasks с колоннами input data, output data и любые другие вы можете (как некоторые даты или идентификаторы пользователя)
  • веб-страницу вставки строк в эту таблицу, как обрабатываемый данных к появляется
  • окна повторно (каждые х секунд) запрашивать таблицу для необработанных задач и выполнять задачи, если таковые имеются; Результаты спасаются в output data колонке
  • по запросу пользователя веб-страницы запросов для данной задачи и отображает его статус, показывающий выходные данные, если он там

Это гораздо более надежный и лучше масштабируется с ростом пользовательского трафика ,Сама услуга идеально создавала рабочие потоки для отдельных задач, чтобы использовать преимущества нескольких ядер. Благодаря такой архитектуре существует множество способов оптимизации производительности и контроля за задачами.

+0

+1 отличный подсказку! - консольное приложение будет запущено из веб-приложения. Отдельный процесс получит имена документов и будет извлекать их, ссылаясь на веб-службу, и объединять их в уникальный файл. Из веб-приложения PrintPage.aspx будет опробовать папку, в которой сгенерированный файл будет удален. Учитывая этот сценарий (когда многие пользователи могут решить печатать в одно и то же время), какой метод вы бы предложили? – Francesco

+0

обновлено для ответа –

+0

WCF может использоваться для избавления от БД; веб-страница вызывает службу через WCF, служба выполняет работу и выводит результат каким-то образом (например, файл), чтобы веб-страница имела к ней доступ. WCF позволит вам отделить эти 2, но все шапки потребуют больше работы, чтобы сделать все правильно. –

0

Может быть, вы создаете содержание списка по

String.Join(";", myList); 

и в вашем приложении вы перестроили его с

String.Split(";", receivedParameter); 

Другой возможностью было бы записать содержимое списка в файл и предоставить в качестве параметра только имя файла, которое консольное приложение должно читать.

0
string listValues = String.Join(",", myList.Select(s => String.Format("\"{0}\"", s)).ToArray()); 
Process console = Process.Start("Client.exe", String.Format("-filename:\"{0}\" -list:{1}", fname, listValues)); 
Смежные вопросы