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();
Это завершит ваше приложение на уровне процесса и уничтожит все потоки, которые были созданы в процессе.