コードにアクセスできる 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() 呼び出しを強制的に中止する方法はありますか?