【问题标题】:C# program (process) will not unloadC#程序(进程)不会卸载
【发布时间】:2009-03-04 20:02:05
【问题描述】:

我有一个 C# 程序,它使用来自另一个程序集的类,并且该类调用非托管 DLL 进行一些处理。这是一个sn-p:

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 函数肯定会返回,所以我不确定这里发生了什么。

【问题讨论】:

    标签: c# interop .net-2.0 unmanaged dllimport


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2020-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-10
          • 2010-10-21
          • 2019-02-14
          • 2017-08-09
          • 1970-01-01
          相关资源
          最近更新 更多