2

別のアセンブリのクラスを使用する 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 関数は確実に返されるので、ここで何が起こっているのかわかりません。

4

3 に答える 3

2

メイン アプリケーションを閉じたときに解放されない非バックグラウンド スレッドをディスパッチする可能性があります。コードを見ないと何とも言えませんが、私はそう思います。

おそらく理想的とは言えませんが、回避策が必要な場合は、おそらく次を使用できます。

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

これにより、アプリがプロセス レベルで終了し、プロセスを通じて生成されたすべてのスレッドが強制終了されます。

于 2009-03-04T20:03:28.380 に答える
0

のソースコードはありunmanaged.dllますか? 別のスレッドを開始して終了しないか、そのスレッドでブロックするなど、何かをしている必要がありますDllMain

于 2009-03-04T20:05:10.793 に答える