2009-03-04 4 views
2

У меня есть программа на C#, которая использует класс из другой сборки, и этот класс вызывает неуправляемую DLL для выполнения некоторой обработки. Вот отрывок:C# program (process) не выгружает

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 Function определенно вернулась, поэтому я не уверен, что здесь происходит.

ответ

0

У вас есть исходный код unmanaged.dll? Он должен что-то делать, либо запускать другой поток, либо не выходить, либо блокировать его DllMain и т. Д.

2

Возможно, он отправит не-фоновый поток, который не отпускает, когда ваше основное приложение закрывается. Не могу сказать точно, не видя кода, но это то, что я бы предположил.

Это, вероятно, меньше, чем идеал, но если вам нужен обходной путь, вы могли бы использовать:

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

Это закончится ваше приложение на уровне процесса и убить все потоки, которые порождаются в процессе.

2

Похоже, ваша неуправляемая библиотека порождает поток для асинхронной обработки.

Коэффициенты: он поддерживает функцию отмены какой-либо; Я предлагаю вам попытаться вызвать это при завершении программы. Если ваша программа только завершила работу до завершения асинхронного вызова, найдите функцию «ждать завершения» и вызовите ее перед возвратом из вашего метода «Func».