Kevin Brady Ответов: 1

Как я могу передать параметры на другую .Net-приложения


Я тестирую простой vb.net консольное приложение (назовем его "дочерним" ). Я хочу передать ему некоторые аргументы из другого приложения (например, "родительского") и заставить его вернуть код выхода.

Вот код для дочернего приложения:
Public Sub Main()

    Environment.ExitCode = 0
    Dim tstr As String = ""

    For i As Short = 0 To My.Application.CommandLineArgs.Count - 1 Step 1
        tstr &= My.Application.CommandLineArgs(i) & vbCrLf
    Next

    If My.Application.CommandLineArgs.Count > 0 Then
        MsgBox("Number of Arguments: " & My.Application.CommandLineArgs.Count & vbCrLf & "Arguments: " & tstr)
        Environment.ExitCode = 1
    End If

    End

End Sub


Вот код вызывающего метода в Родительском приложении:
Private Sub ChkDBUtility() Handles cmdChkDBUtility.Click

    Dim iProcess As Process = Nothing
    If IsProcessRunning(mDBUtilName) = False Then
        ' the process is not running
        ' determine if the application is installed
        If IsFile(mFullUtilPgmName) = True Then
            Dim startInfo As ProcessStartInfo = New ProcessStartInfo(mFullUtilPgmName)
            startInfo.WindowStyle = ProcessWindowStyle.Normal
            startInfo.Arguments = "Test123"
            iProcess = Process.Start(startInfo)
            iProcess.WaitForExit()
            If iProcess.HasExited Then
                Dim i As Integer = iProcess.ExitCode
                MsgBox("Return code = " & i)
            End If
        End If
    End If

End Sub


Примечание: переменные "mDBUtilName" и "mFullUtilPgmName" назначаются в другом месте родительского приложения и являются правильными.

Дочернее приложение, похоже, не получает переданные параметры. То есть,
CommandLineArgs.Count
никогда не бывает больше нуля.

Что я уже пробовал:

Я пробовал различные способы получения аргументов командной строки в дочернем приложении, включая:
Public Sub Main(ByVal args() As String)

И
Dim arguments As String() = Environment.GetCommandLineArgs()
в главной субмарине.

Я также запустил дочернее приложение в режиме отладки в visual studio и установил аргументы командной строки на вкладке debug проекта. Это, кажется, работает нормально.

Я попытался обернуть переданный параметр в тройные кавычки.

Maciej Los

Почему? Process.Start(startInfo) получает только один аргумент? Он должен получить как минимум два аргумента: один - приложение для запуска, второй - аргумент.

Kevin Brady

Имя приложения задается в операторе инициализации:
Дим информацию как изменение панели = новый изменение панели(mFullUtilPgmName)

Kevin Brady

Я получил это от: https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.arguments(v=vs. 110).aspx

Maciej Los

Какой фреймворк: WinForm, ConsoleApp, WPF, WebUI?

Kevin Brady

Это консольное приложение. Пусковой объект - это основная подлодка. Is IS net frame work 4.0 профиль клиента.

1 Ответов

Рейтинг:
5

Richard MacCutchan

Проверьте пример кода следующим образом :
ProcessStartInfo.Доводы Собственность (Системы.Диагностика)[^]


Maciej Los

Ричард, OP использует свойство Arguments в своем коде. Похоже, эта проблема где-то в другом месте.

Richard MacCutchan

Да, это очевидно, но нам нужно больше деталей.

Maciej Los

Это тоже очевидно ;)

Kevin Brady

Ричард: ссылка, которую вы предоставили, такая же, как и ссылка, которую я упомянул. Код, который я написал в этом посте, был получен из страницы ссылок.

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

Richard MacCutchan

Ну, я только что попробовал этот код, и он отлично работает, так что в вашей системе должно быть что-то еще.

Kevin Brady

Ричард: у тебя есть какие-нибудь идеи, в каком направлении я могу двигаться?

Kevin Brady

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

Kevin Brady

Я нашел это в интернете: https://robindotnet.wordpress.com/2010/03/21/how-to-pass-arguments-to-an-offline-clickonce-application/

Kevin Brady

Очевидно, вы не можете передать аргументы в приложение click once. Итак, как вы построили сборку дочернего процесса?

Kevin Brady

Я нашел это: https://stackoverflow.com/questions/923607/remove-clickonce-from-a-winforms-app#_=_

У меня было, есть и будет "один раз нажмите приложений" на вкладку "Безопасность" и флажок "подписать один раз нажать манифеста" на вкладке трансферов. Каждый раз, когда я публикую сборку, поле приложения Click Once перепроверяется. Я не могу заставить его уйти.

Richard MacCutchan

В вашем первоначальном вопросе говорилось, что это простое консольное приложение. Я не использовал ClickOnce, поэтому не могу предложить никаких предложений.

Kevin Brady

Это простое консольное приложение. Visual studio делает его приложением click once, и я не могу понять, как сделать его не приложением click once.

Как вы создали сборку?

Richard MacCutchan

Я просто создаю новое консольное приложение в Visual Studio, поэтому понятия не имею, как вы умудрились получить версию Click Once.

Кстати, если вы хотите ответить на мое сообщение, пожалуйста, используйте кнопку ответа над ним, так как это приведет к тому, что система отправит мне уведомление.

Kevin Brady

Теперь я понимаю. Я пытался "опубликовать" приложение (то, что я привык делать) вместо того, чтобы просто создавать файл .exe. Теперь я чувствую себя идиотом. Спасибо, что помогли мне разобраться в этом вопросе.

Richard MacCutchan

Не беспокойтесь, простые проблемы часто являются самыми трудными для решения.