我有一个C#程序,它使用另一个程序集中的类,这个类调用一个非托管DLL来进行一些处理。这是一个片段:

public class Util
{
    const string dllName = "unmanaged.dll";
    [DllImport(dllName, EntryPoint = "ExFunc")]
    unsafe static extern bool ExFunc(StringBuilder path, uint field);

    public bool Func(string path, uint field)
    {
        return ExFunc(new StringBuilder(path), field);
    }

    ...
}

Util util = new Util();
bool val = util.Func("/path/to/something/", 1);

我遇到的问题是,如果我打电话给“Func”我的主要C#程序不会卸载。当我在主窗体中调用Close()时,如果我查看任务管理器,该过程仍将存在。如果我删除对“Func”的调用程序卸载很好。我做了一些测试,程序Main函数肯定会返回,所以我不确定这里发生了什么。

有帮助吗?

解决方案

你有 unmanaged.dll 的源代码吗?它必须做某事,要么启动另一个线程而不退出,要么阻塞它的 DllMain 等。

其他提示

看起来您的非托管库正在生成一个用于异步处理的线程。

赔率是否支持某种取消功能;我建议您尝试在程序关闭时调用它。如果您的程序刚刚在异步调用完成之前完成,请查找“等待完成”。函数并在从“Func”返回之前调用它方法。

当主应用程序关闭时,它可能会调度一个非后台线程。如果没有看到代码就不能肯定地说,但这就是我的假设。

它可能不太理想,但如果你需要一个解决方法,你可以使用:

System.Diagnostics.Process.GetCurrentProcess().Kill();

这将在进程级别结束您的应用程序并终止通过该进程生成的所有线程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top