C#程序(进程)将不会卸载

C#程序(进程)将不会卸载,c#,interop,.net-2.0,unmanaged,dllimport,C#,Interop,.net 2.0,Unmanaged,Dllimport,我有一个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

我有一个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”的调用,程序将正常卸载。我已经做了一些测试,程序的主函数肯定会返回,所以我不确定这里发生了什么

它可能会分派一个非后台线程,在主应用程序关闭时该线程不会释放。在没有看到代码的情况下无法确定,但这是我的假设

这可能不太理想,但如果您需要解决方案,您可能会使用:

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

这将在进程级别结束你的应用程序,并杀死通过进程生成的所有线程。

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

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

它可能支持某种类型的取消功能;我建议您尝试在程序关闭时调用它。如果您的程序在异步调用完成之前刚刚完成,请查找“wait for completion”函数,并在从“Func”方法返回之前调用该函数