C # программа (процесс) не будет выгружена - PullRequest
2 голосов
/ 04 марта 2009

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

Ответы [ 3 ]

2 голосов
/ 04 марта 2009

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

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

2 голосов
/ 04 марта 2009

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

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

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

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

0 голосов
/ 04 марта 2009

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

...