Вопрос

У меня есть программа на 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();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top