我正在尝试使用可以访问代码的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()调用?
答案 0 :(得分:1)
如果您可以找到由DLL后台线程创建的窗口句柄(例如窗体或隐藏的应用程序窗口),您可以将WM_QUIT消息发布到该句柄,这应该导致DLL干净地退出消息循环
答案 1 :(得分:0)
您需要获取在另一个线程中运行的表单实例,然后调用form.BeginInvoke并从那里调用Application.Exit
答案 2 :(得分:0)
Application.ExitThread
怎么样?