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 回答
0

Application.ExitThread 怎么样

于 2016-07-29T21:59:53.443 回答