0

いくつかのライブラリをテストするために作成した winforms アプリがあります。すべてのテスト設定をコマンド ライン引数として渡すことができるように、このプログラムをセットアップしました。また、ファイルからこれらのテスト設定の 1 つ以上のセットを読み込み、設定のセットごとにこの winforms テスト アプリを 1 回起動する 2 つ目のコンソール アプリも作成しました。各テストの実行は CPU に打撃を与えるため、実行は同時に行うのではなく、順番に行います。次のように呼び出して、winforms アプリを起動します。

WinFormAppNamespace.Program.Main(settings)

これは最初は問題なく動作しますが、2 回目の実行では、winform アプリの Program.cs から次のような InvaldOperationException が返されます。

アプリケーションで最初の IWin32Window オブジェクトが作成される前に、SetCompatibleTextRenderingDefault を呼び出す必要があります。

どうやら、静的な main(...) メソッドを呼び出してアプリを起動すると、いくつかの状態が作成され、実行後に破棄されません。

これにはいくつかの解決策があります。

1)最初の実行後にアプリケーションを破棄します-これを行う方法がわかりません。静的メソッドを呼び出しましたが、何も返されませんでした。そのため、winforms アプリを実行してインスタンス化されたものにはアクセスできないと思います。

2) Program.cs で、SetCompatibleTextRenderingDefault(false) 呼び出しにチェックを入れて、ウィンドウが作成されない場合にのみ実行されるようにします。繰り返しますが、これを確認するためにインスタンス情報にアクセスできるかどうかはわかりません。

3) 独自のプロセスでアプリを実行します。これを機能させるには追加の app.config ファイルをコピーする必要があるため、これを回避しようとしていましたが、これが唯一のオプションであると考え始めています。

考え?

4

2 に答える 2

2

Application.SetCompatibleTextRenderingDefaultフォームが作成されて表示された後に呼び出すことはできません。

Mainこれは基本的に、WinForms アプリで自分自身を複数回直接呼び出すことができないことを意味します。

Main再度呼び出す前に、アプリを終了する必要があります。

于 2012-08-21T19:08:46.030 に答える
0

静的な Main(...) メソッドを呼び出してプログラムを実行するのは 1 回だけであることがわかったので、メイン フォームをインスタンス化して ShowDialog() を呼び出すのが適切であると結論付けました。実行中のプログラムが Application.Exit() を呼び出して終了しないことを確認してください。そうしないと、予期しない結果が生じる可能性があります。

于 2012-08-22T15:59:10.537 に答える