Domanda

Ho un programma C # che utilizza una classe di un altro assembly e questa classe chiama una DLL non gestita per eseguire alcune elaborazioni. Ecco uno snippet:

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

Il problema che sto riscontrando è che se chiamo " Func " il mio programma C # principale non verrà scaricato. Quando chiamo Close () all'interno del mio modulo principale, il processo sarà ancora presente se cerco in Task Manager. Se rimuovo la chiamata a " Func " il programma si scarica bene. Ho fatto alcuni test e la funzione principale del programma ritorna sicuramente, quindi non sono sicuro di cosa stia succedendo qui.

È stato utile?

Soluzione

Hai il codice sorgente su unmanaged.dll ? Deve fare qualcosa, o avviare un altro thread e non uscire, o bloccarlo nel suo DllMain , ecc.

Altri suggerimenti

Sembra che la tua libreria non gestita stia generando un thread per l'elaborazione asincrona.

Le probabilità sono che supporti una funzione di annullamento di qualche tipo; Ti suggerisco di provare a chiamarlo all'arresto del programma. Se il tuo programma è in fase di completamento prima del completamento della chiamata asincrona, cerca un " attendi il completamento " prima di tornare dalla tua funzione "Func" metodo.

Potrebbe inviare un thread non in background che non si stacca alla chiusura dell'applicazione principale. Non posso dirlo senza vedere il codice, ma è quello che suppongo.

Probabilmente è meno che ideale, ma se hai bisogno di una soluzione alternativa potresti probabilmente usare:

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

Questo finirà la tua app a livello di processo e ucciderà tutti i thread generati attraverso il processo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top