2009-03-04 29 views
2

'yi kaldıramadı Başka bir derlemeden bir sınıf kullanan bir C# programım var ve bu sınıf bazı işlemleri yapmak için yönetilmeyen bir DLL'yi çağırıyor.C# program (işlem),

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

I having Ararsam "Func" benim ana C# programı boşaltmadın olmasıdır: Burada snippet'idir. Ana formumun içinde Close() öğesini çağırdığımda, Görev Yöneticisi'ne baktığımda süreç hala orada olacak. Eğer çağrıyı "Func" 'e çıkarırsam, program iyi bir şekilde boşalır. Bazı testler yaptım ve ana fonksiyonlar kesinlikle geri döndü, bu yüzden burada neler olduğundan emin değilim.

cevap

0

Kaynak kodunuz unmanaged.dll var mı? DllMain, ya da başka bir iş parçacığı başlatılıyor, ya da DllMain, vb. Içinde bir şeyler yapıyor olmalıdır.

2

Ana uygulamanız kapandığında izin vermeyen arka plan olmayan bir iş parçacığı gönderebilir. Kodu görmeden kesin bir şey söyleyemem ama bunu kabul edeceğim.

İdeal sonra muhtemelen daha az, ama geçici bir çözüm gerekiyorsa muhtemelen kullanabilirsiniz:

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

Bu süreç düzeyinde uygulamanızı sonlandırmak ve süreç boyunca kökenli tüm konuları öldürecektir.

2

Yönetilmeyen kitaplığınız, eşzamansız işlem için bir iş parçacığı oluşturuyor gibi görünüyor.

Oranlar, bir çeşit iptal işlevini destekler; Programın kapatılmasında bunu denemenizi öneririm. Programınız asenkron çağrının tamamlanmasından önce tamamlanıyorsa, "tamamlanma süresini bekle" işlevine bakın ve "Func" yönteminizden dönmeden önce bunu çağırın.