Pergunta

Eu tenho um programa C # que usa uma classe de outro assembly, e esta classe chama uma DLL não gerenciado para fazer algum processamento. Aqui está um trecho:

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

O problema que estou tendo é que, se eu chamo de "Func" o meu principal programa C # não irá descarregar. Quando eu chamar Close () dentro do meu formulário principal o processo ainda vai estar lá se eu olhar no Gerenciador de tarefas. Se eu remover a chamada para "Func" o descarrega programa bem. Eu fiz alguns testes e programas função principal definitivamente retorna então eu não sei o que está acontecendo aqui.

Foi útil?

Solução

Do que você tem o código fonte para unmanaged.dll? Ele deve estar fazendo algo, seja começando outro segmento e não sair, ou bloqueando nele de DllMain, etc.

Outras dicas

Parece que sua biblioteca não gerenciada está gerando uma thread para o processamento assíncrono.

As probabilidades são de que ele suporta uma função de algum tipo cancelar; Eu sugiro que você tentar chamar que no desligamento programa. Se o seu programa é apenas completar antes da chamada assíncrona acontece para completar, olhar para uma função "aguardar a conclusão" e chamada que antes de retornar de seu método "Func".

Pode enviar um segmento não de fundo que não está deixando ir quando seus principais fecha aplicação. Não posso dizer com certeza sem ver o código, mas isso é o que eu diria.

É provavelmente a menos de ideal, mas se você precisa de uma solução alternativa você provavelmente poderia usar:

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

Isso vai acabar a sua aplicação no nível do processo e matar os tópicos que são gerados durante o processo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top