ProgramCodePav
@ProgramCodePav
Front-end developer. Love open source

Как получить данные из стандартных команд cmd.exe в своем приложении на C#, не вызывая подпрограммы?

Добрый день!

Хочу написать небольшое приложение визуализации данных, получаемых с помощью команд cmd.exe (ping, tracert, netsh, etc.) на C# windows form.

Дело в том, что все команды являются программами (ping.exe, etc) в system32. И можно их вызывать и общаться с помощью класса Process. Но Цель заключается в том, чтобы не прибегать к запуску программ cmd, но использовать их функции (трассировка пакетов и т.д.).

Я пробовал рефлексией воспользоваться, но у программ нет протоколов сборки. Есть какие-нибудь решения?

Если нет, то что необходимо для собственной реализации данных функций?
  • Вопрос задан
  • 3338 просмотров
Решения вопроса 1
@mayorovp
У вас путаница в мыслях... Во-первых, "подпрограмма" - это в C# синоним метода. Если вы используете winforms - то вы уже используете кучу подпрограмм :) А то, чего вы хотите избежать, называется "внешняя программа" или "дочерний процесс".

Во-вторых, рефлексия возможна только в отношении программ на платформе .NET - а перечисленные вами программы являются нативными. Разумеется, рефлексия в их отношении невозможна. По той же причине бесполезно из декомпилировать - все равно вам надо будет писать то же самое на другом языке.

В-третьих, ping, tracert и netsh не являются командами cmd.exe. Команды cmd.exe - это echo, if, call, set, goto, for и т.д., а то, что вы перечислили - это системные утилиты.

Теперь по вопросу.

ping. Имеется вот этот класс: msdn.microsoft.com/en-us/library/system.net.networ... Ни разу с ним не работал, но выглядит удобным.

tracert. Используйте тот же класс, указав Ttl в PingOptions.

netsh. Тут все сложнее. Дело в том, что эта программа - обертка для кучи разных настроек, находящихся в совершенно разных местах. Если вам нужно получать данные - то попробуйте поискать их в msdn.microsoft.com/en-us/library/system.net.networ... Если их там нет - гуглите. Главное - гуглите без ключевого слова netsh.

etc. А вот тут все не просто сложно, а невозможно. Невозможно взять неизвестную заранее утилиту, и сделать то же самое, что она делает, не запуская ее при этом. Поэтому вам надо определиться - либо ваша программа умеет выполнять фиксированный список действий - либо ей можно передать любую команду, но она будет запускать дочерние процессы. Возможен и промежуточный вариант - есть действия, которые программа может выполнять сама, а для выполнения других будут запускаться дочерние процессы.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы