C#プログラム(プロセス)はアンロードされません
質問
別のアセンブリのクラスを使用する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();
これにより、プロセスレベルでアプリが終了し、プロセスを通じて生成されるすべてのスレッドが強制終了されます。