Есть ли способ отобразить форму Windows ДО того, как форма загрузки будет загружена в VB.NET? - PullRequest
0 голосов
/ 21 декабря 2010

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

Это никогда не было проблемой для наших пользователей, которые запускают программное обеспечение с помощью сценариев, в которых необходимые аргументы командной строки предоставляются автоматически. Но иногда при отладке нашего программного обеспечения мы, разработчики, забываем указывать необходимые параметры в параметрах отладки Visual Studio; тогда это очень раздражает, когда меня приветствуют сообщением Спецификация конфигурации недействительна - отсутствуют обязательные параметры X, Y и Z - отключается (я перефразирую, конечно).

Это не так уж важно, просто раздражение. Тем не менее, я чувствовал, что стоит собрать небольшую форму, чтобы сделать этот процесс менее болезненным; он уведомляет пользователя о том, какие параметры отсутствуют, и позволяет ему / ей указывать значения этих параметров непосредственно в форме, не перезапуская приложение.

Мои намерения были хорошими (я думаю?), Но, похоже, я не могу заставить это решение действительно работать. Проблема в том, что после того, как я запустил наше программное обеспечение с пропущенными настройками, всплывает форма и выдает сообщение, как и ожидалось; но после того, как я ввел обязательные параметры и пришло время «по-настоящему» запустить приложение, я получаю InvalidOperationException:

SetCompatibleTextRenderingDefault must быть вызванным до первого IWin32Window объект создается в применение.

Мне кажется, я понимаю, что здесь происходит: проект VB.NET, над которым я работаю, делает что-то вроде этого "за кадром" *:

Sub Main()
    Application.EnableVisualStyles()
    Application.SetCompatibleTextRenderingDefault(False)
    Application.Run(New MainForm)
End Sub

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

Есть ли способ обойти это? Возможно, есть более «правильное» решение этой проблемы, о котором я не думаю (т. Е. Не должен ли я вообще пытаться собрать пользовательский ввод через форму)?

* Это лучшее предположение, основанное на том, что я видел в проектах C # WinForms. Как ни странно, если я что-то упускаю, кажется, что проекты VB.NET WinForms полностью скрывают это от разработчика.

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

Убедитесь, что у вас отключена опция среды приложения и выбран Sub Main в качестве метода запуска. Сделайте так, чтобы это выглядело примерно так:

Sub Main(ByVal args() As String)
    Application.EnableVisualStyles()
    Application.SetCompatibleTextRenderingDefault(False)
    If args.Length = 0 Then
        Using dlg As New OptionsDialog
            If dlg.ShowDialog <> DialogResult.OK Then Return
            '' Use dlg result...
        End Using
    End If
    Application.Run(New MainForm)
End Sub
0 голосов
/ 21 декабря 2010

Возможно, вы могли бы использовать статическую Debugger.IsAttached (или даже директиву #DEBUG) в "основной" функции вашей программы, которая подает некоторый входной файл (скажем, файл XML) в вашу разобранную коллекцию аргументоввместо этого?

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