2010-12-20 252 views
0

私の会社の主なソフトウェアパッケージには、起動時に読み込まれる膨大な構成ライブラリが含まれています。この設定ライブラリにはいくつかの必須設定が含まれていますが、コマンドライン引数で指定しないとアプリケーション全体が終了します。「スタートアップ」フォームがVB.NETに読み込まれる前にWindowsフォームを表示する方法はありますか?

これは、ユーザーが必要とするコマンドライン引数が自動的に提供されるスクリプトを使用してソフトウェアを起動するユーザーにとって、これまで問題となったことはありません。しかし、私たちのソフトウェアをデバッグするとき、開発者はVisual Studioのデバッグオプションで必要な引数を指定することを忘れてしまいます。 設定の仕様が無効です - 必要なパラメータX、Y、Zがありません -をシャットダウンしています(私はもちろん言い換えられません)。

これは本当に大きな問題ではなく、単なる迷惑です。それでも、私はこのプロセスを少し難しくするための小さなフォームを一緒に投げることは価値があると感じました。どのパラメータが不足しているかをユーザーに通知し、アプリケーションを再起動することなくフォーム上に直接パラメータの値を指定することができます。

私の意図は良いと思いましたが、実際にはこの解決策を得ることができないようです。問題は、設定が不足してソフトウェアを起動した後、フォームがポップアップして私に期待どおりのメッセージが表示されることです。しかし、私は必要なパラメータを入力した後、それはアプリケーションが「本当に」私はこのInvalidOperationExceptionを取得し、開始するための時間です:最初の IWin32Windowオブジェクトが アプリケーションで作成される前に、

SetCompatibleTextRenderingDefaultは 呼び出さなければなりません。

私はここで何が起こっているかを理解すると思う:私が働いているVB.NETプロジェクトは、「舞台裏」は、このような何かをやっている*:SetCompatibleTextRenderingDefaultに呼び出す

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

があり、明らかに、実行前にフォームがすでに作成されて表示されているため、例外をスローします。

これを回避する手段はありますか?この問題の解決には、私が考えていない(つまり、フォームを介してユーザー入力を集めようとしてはいけないのか)という、より適切な解決策がありますか?

*これは、C#WinFormsプロジェクトで見たものに基づいて推測するのが最適です。不思議なことに、何かが欠けていない限り、VB.NETのWinFormsプロジェクトはこれを開発者から完全に隠しているようです。

答えて

3

アプリケーションフレームワークオプションをオフにし、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

+1絶対に。 Appフレームワークはいくつかの点で優れていますが、より多くのコントロールが必要なアプリを見つけたら、それをオフにして自分でロールバックする必要があります。 – DarinH

+0

毎日何か新しいことを学ぶ... –

0

おそらく、静的なDebugger.IsAttached(または#DEBUGディレクティブ)をプログラムの "main"関数で使用して、入力ファイル(XMLファイルなど)を解析済みのargsコレクションにフィードすることは可能でしょうか?

関連する問題