2009-03-04 10 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); 

問題は、私が "Func"を呼び出すとメインのC#プログラムがアンロードされないということです。メイン・フォームの中でClose()を呼び出すと、タスク・マネージャーを見るとプロセスがそこに残ります。私が "Func"への呼び出しを取り除くと、プログラムはうまくアンロードされます。私はいくつかのテストを行っており、メイン関数が確実に返ってくるので、ここで何が起こっているのか分かりません。

答えて

0

unmanaged.dllのソースコードをお持ちですか?別のスレッドを開始して終了しないか、ブロックしているかのいずれかでなければなりません。DllMainなど

2

メインアプリケーションが終了しても、バックグラウンドスレッドでないスレッドをディスパッチする可能性があります。コードを見ることなく確実に言うことはできませんが、それは私が想定するものです。

それは理想的な、おそらく少ないのですが、あなたは回避策が必要な場合は、おそらく使用できます。

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

これは、プロセスレベルでアプリケーションを終了し、プロセスを通じて生み出されているすべてのスレッドを殺すでしょう。

2

非管理ライブラリが非同期処理のスレッドを生成しているようです。

これは何らかの並べ替えのキャンセル機能をサポートしています。プログラムのシャットダウン時に呼び出すようにしてください。非同期呼び出しが完了する前にプログラムが完了している場合は、「完了待ち」関数を探し、「Func」メソッドから戻る前に呼び出します。

関連する問題