1

コードにアクセスできる C# DLL を使用しようとしていますが、実際にコードを変更してカスタム バージョンをビルドすることはできません。呼び出しコードは C# WinForms プロジェクトであり、C# DLL も WinForms を使用して Windows システム イベントを処理します。問題は、DLL がバックグラウンド スレッドを使用してその内部で Application.Run() を使用し、そのスレッドを強制終了または停止する組み込みの方法があることです。コードのスニペットを次に示します。

public class DllClass
{
    private Thread uithread = null;
    private bool uithreadstarted = false;

    public DllClass()
    {
        uithread = new Thread(new ThreadStart(RunDll));
        uithread.IsBackground = true;
        uithread.SetApartmentState(ApartmentState.STA);
        uithread.Start();
        do
        {
            Thread.Sleep(100);
        } while (uithreadstarted == false);
    }

    private void RunDll()
    {
        //other init stuff here
        uithreadstarted = true;
        Application.Run();
    }
}

どうやらそれを殺すことが期待される方法は、Application.Exit() を使用することですが、それは自分の WinForms プロジェクトも終了します。これは私が望んでいることではありません。Application.Exit() を呼び出さずにアプリケーションを閉じると、DLL はバックグラウンドで実行され続けます。DllClass オブジェクトをインスタンス化して使用し、完了したらシャットダウンできるようにしたいと考えています。実行中のスレッドの Thread オブジェクトを取得するメソッドを思いつきましたが、それに対して Thread.Abort() を呼び出しても、実際にはスレッドが強制終了されません。DLL の外部から Application.Run() 呼び出しを強制的に中止する方法はありますか?

4

3 に答える 3

1

DLL バックグラウンド スレッド (フォームや非表示のアプリケーション ウィンドウなど) によって作成されたウィンドウ ハンドルが見つかった場合は、そのハンドルに WM_QUIT メッセージを送信できます。これにより、DLL はメッセージ ループを正常に終了します。

于 2013-04-25T17:57:06.170 に答える
0

他のスレッドで実行されているフォームのインスタンスを取得し、form.BeginInvoke を呼び出し、そこから Application.Exit を呼び出す必要があります。

于 2013-04-25T17:12:11.880 に答える