Frage

Ich habe ein C # Programm, das eine Klasse von einer anderen Assembly verwendet, und diese Klasse ruft eine nicht verwaltete DLL einige Verarbeitung zu tun. Hier ist ein Ausschnitt:

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

Das Problem, das ich habe, ist, dass, wenn ich „Func“ nenne mein Haupt C # Programm wird nicht entladen. Als ich Close () aufrufen, in meinem Hauptformular wird der Prozess noch da sein, wenn ich in den Task-Manager zu suchen. Wenn ich den Anruf zu „Func“ entfernen leert das Programm in Ordnung. Ich habe einige Tests durchgeführt und die Programme Hauptfunktion auf jeden Fall wieder so bin ich nicht sicher, was hier vor sich geht.

War es hilfreich?

Lösung

Haben Sie den Quellcode unmanaged.dll? Es muss etwas tun, entweder ausgehend anderen Thread und nicht austritt, oder Blockierung in seinem DllMain, etc werden.

Andere Tipps

Es sieht aus wie Ihre nicht verwalteten Bibliothek ist ein Thread für die asynchrone Verarbeitung Laichen.

Odds sind es eine Funktion irgendeine Art aufheben unterstützt; Ich schlage vor, dass Sie versuchen, dass Abschaltung bei Programm aufzurufen. Wenn Ihr Programm abgeschlossen wird, kurz bevor der asynchrone Aufruf abgeschlossen geschieht, suchen Sie nach einer „für die Fertigstellung warten“ Funktion und das nennt, bevor sie von Ihrer „Func“ Methode zurück.

Es könnte einen nicht Hintergrund-Thread versenden, die nicht im Stich gelassen wird gehen, wenn die Hauptanwendung schließt. Kann nicht sicher sagen, ohne den Code zu sehen, aber das ist das, was ich würde annehmen.

Es ist wahrscheinlich weniger als ideal, aber wenn Sie eine Abhilfe benötigen könnten Sie wahrscheinlich verwenden:

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

Dies wird Ihren App auf der Prozessebene beenden und alle Themen tötet, die durch den Prozess erzeugt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top