2009-03-04 74 views
2

我有一个C#程序使用另一个程序集中的类,并且此类调用非托管DLL来执行一些处理。这里是一个片段:C#程序(进程)不会卸载

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); 

我遇到的问题是,如果我叫“功能”我的主C#程序将无法卸载。当我在主窗体中调用Close()时,如果我查看任务管理器,该过程仍然会在那里。如果我删除对“Func”的调用,则程序卸载正常。我做了一些测试,程序的主要功能肯定会返回,所以我不确定这里发生了什么。

回答

0

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

2

它可能会派发一个非后台线程,当您的主应用程序关闭时不会放开。不能确定没有看到代码,但这是我会假设的。

这可能不到理想的,但如果你需要一个解决办法,你很可能使用:

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

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

2

它看起来像你的非托管库产生了一个异步处理线程。

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