Отправить строку из дочернего приложения в родительское

Моя программа VB.NET WinForms (родительская) вызывает другую консольную программу VB.NET (дочернюю) с Process.Start(). Дочернее приложение работает быстро, и я хотел бы, чтобы сообщение о состоянии возвращалось родителю. Как я могу отправить строку от ребенка к родителю?

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


person Steven    schedule 14.04.2010    source источник


Ответы (2)


Чтобы добавить код к другому моему комментарию, представьте себе следующую простую дочернюю программу:

Module Module1
    Sub Main()
        Console.WriteLine("This is a test")
    End Sub
End Module

А вот родитель:

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim P As New Process()
        P.StartInfo.FileName = "Child.exe"
        P.StartInfo.RedirectStandardOutput = True
        P.StartInfo.UseShellExecute = False
        P.Start()
        Dim T = P.StandardOutput.ReadToEnd()
        'Do something with T
    End Sub
End Class
person Chris Haas    schedule 14.04.2010

Вы можете заставить вызывающее приложение отправлять аргументы командной строки через Proccess.Start(), которые затем использует вызываемое приложение.

В зависимости от ваших требований / архитектуры, это либо хороший, простой дизайн; или ужасная идея.

Я предполагаю первое; но если это последнее, я настоятельно рекомендую использовать для этого WCF. Прямые вызовы сокетов уже давно стали способом додо, за исключением приложений с большим объемом / производительностью, таких как видеоигры. А с WCF у вас может быть клиент, отправляющий данные своего серверного приложения в очень нескольких строках кода.

Каковы ваши требования здесь? Сообщения будут отправляться часто или только в начале? Как часто это случается?

person dferraro    schedule 14.04.2010
comment
Мне нужно, чтобы дочерняя программа просто принимала аргумент командной строки, загружала файл, отправляла итоговое сообщение и завершала работу. Единственная часть, которую я не могу понять, это отправить сводное сообщение обратно. Дочерняя программа, скорее всего, не займет и полсекунды. - person Steven; 14.04.2010
comment
В этом случае пусть ваш родитель вызовет Process.Start, а потомок запишет в StandardOutput/StandardError. Вы можете прочитать их обратно в родителях, перенаправив эти вызовы. stackoverflow.com/questions/206323/ - person Chris Haas; 14.04.2010
comment
Похоже, мое предположение было верным. Вы не хотите заниматься использованием аргументов командной строки для IPC для этого. Я бы настоятельно рекомендовал использовать WCF; это очень высокий уровень, попробуйте ввести "WCF Tutorial" в Google. Вот одна ссылка, которую я бегло просмотрел, и она выглядела прямолинейной: .com/туториалы/ - person dferraro; 14.04.2010
comment
Ребенок просто вызывает Console.Write() или мне следует использовать другой метод? - person Steven; 14.04.2010
comment
@ Крис, а как насчет параллелизма, прав доступа к файлам, общих файловых ресурсов и т. Д. ?? Если это не какое-то хобби-приложение, которое вы делаете дома по личным причинам, я не думаю, что это хорошая идея. Если это какое-либо LOB / критически важное приложение, то вы просто напрашиваетесь на неприятности ... Мы говорим, возможно, о нескольких дополнительных днях работы инженера-программиста среднего уровня, чтобы преобразовать это в использование WCF. Черт, за 150$ я это сделаю, это займет всего несколько часов ;) - person dferraro; 14.04.2010
comment
@dferraro не уверен, о чем ты говоришь. Параллелизм не является проблемой, потому что это отдельное приложение. Разрешения/общие ресурсы - это проблема с Process.Start() в целом, но если он может это вызвать, то он может получить доступ к StandardOut/Error. - person Chris Haas; 14.04.2010
comment
@ Стивен, да, просто напиши в консоль. Приятной частью этого является то, что у вас также есть приложение командной строки, которому даже не обязательно требуется родительское приложение. - person Chris Haas; 14.04.2010
comment
не будет ли проблем с параллелизмом, когда у вас есть 100 клиентов winforms, называющих эту консоль «сервером»? Что происходит в этом сценарии? Как насчет даже всего 10 клиентов? - person dferraro; 14.04.2010
comment
Он вызывает программу командной строки. Если все 100 клиентов winform вызывают это, то каждый клиент/машина создаст отдельный изолированный процесс для EXE, запустит его и получит информацию. Это лучший способ работать со 100 клиентами winform? Наверное, нет, но это не его вопрос. - person Chris Haas; 14.04.2010
comment
Думаю, меня больше всего беспокоила безопасность, среди прочего... (он упомянул об изучении сокетов и т. д.).. лучше выдать себя за какую-то учетную запись, которая имеет права только на тот общий ресурс, содержащий exe в вашем коде winforms. В противном случае потребуется только один злонамеренный пользователь, чтобы просто перейти в папку и удалить ваш «сервер». Это просто кричит о плохом дизайне, но каждому свое... - person dferraro; 15.04.2010