[C#] System.IO.FileNotFoundException beim Start

real-insanity

Erfahrenes Mitglied
Hallo zusammen ich habe seit geraumer Zeit (reproduzierbar auf einem Rechner) das Problem, dass meine Anwendung direkt beim Start mit folgender Meldung trümmert:
Anwendung: SoundConductor - HarderRadio.FM Edition.exe
Frameworkversion: v4.0.30319
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
Ausnahmeinformationen: System.IO.FileNotFoundException
Stapel:
bei SoundConductor.Common.Helper.DatabaseHelper..ctor(System.String)
bei SoundConductor.Common.Helper.DataHelper..ctor()
bei SoundConductor.frmMain..ctor()
bei SoundConductor.Program.Main()

Diese Meldung finde ich aber nur im Eventlog vom Windows.
Eine Exception wirft mir das Programm, trotz try-catch nicht.

Was mir aufgefallen ist, in der Klasse "DatabaseHelper" benutze ich kein "ctor()".
Ich finde auch nicht den Ursprung dieser Meldung, da alle benötigten Komponente (wie z.B. SQL-Lite Datenbanken) bereits vorhanden und lesbar sind.

Gibt es eine Möglichkeit zu erzwingen, dass der Ablauf der Programms (in dem Falle der Start) weiterläuft, egal was ist?

Ich verwende extra überall Try-Catch damit das Programm noch weiterläuft.
Kurioserweise bekomme ich diee Meldung aber bisher nur an einem Rechner.
Auf allen, bisher getesteten Kisten, startet die Anwendung ohne Probleme.

Habt ihr eine Idee wie ich das Debuggen kann so, dass ich den Ursprung des Fehlers finde?
 
Hallo,

eigentlich weist ja die Fehlermeldung direkt auf das Problem hin: FileNotFoundException (was in der Regel ein Zugriff auf eine nicht vorhandene Datei oder einen fehlerhaften Pfad, bedeutet)

Hast Du diese FileNotFoundException explizit abgefangen?

Wenn es reproduzierbar ist, würde ich die DEBUG-Version der Anwendung über die Konsole am Zielrechner mit dem Parameter "-debug" starten, damit kann man schon mal sehen, ob das ding überhaupt läuft.

Hat der Rechner die gleiche Frameworkversion oder wird diese von Deiner Anwendung geprüft?

Hast Du alle Pfadangaben, die Dein Programm benötigt kontrolliert?

Wenn sonst nichts hilft, würde ich sagen, bau einen Logger ein, wenn der einigermaßen implementiert wird, kann man ohne Probleme nachvollziehen, woran das ganze liegt, denke ich :)


Viele Grüße
 
Hallo,

eigentlich weist ja die Fehlermeldung direkt auf das Problem hin: FileNotFoundException (was in der Regel ein Zugriff auf eine nicht vorhandene Datei oder einen fehlerhaften Pfad, bedeutet)

Hast Du diese FileNotFoundException explizit abgefangen?
Nein, ich fange einfach alle Exceptions ab.

Wenn es reproduzierbar ist, würde ich die DEBUG-Version der Anwendung über die Konsole am Zielrechner mit dem Parameter "-debug" starten, damit kann man schon mal sehen, ob das ding überhaupt läuft.
Genau das selbe wie im ersten Post beschrieben.
Keine Exception, nix. Nur das was im EventLog steht.

Hat der Rechner die gleiche Frameworkversion oder wird diese von Deiner Anwendung geprüft?
Hast Du alle Pfadangaben, die Dein Programm benötigt kontrolliert?
Das prüft mein Setup schon und will die entsprechende Version installieren.

Wenn sonst nichts hilft, würde ich sagen, bau einen Logger ein, wenn der einigermaßen implementiert wird, kann man ohne Probleme nachvollziehen, woran das ganze liegt, denke ich :)
Also ich habe in den entsprechenden CATCH-Blöcken meine eigene DebugLog-Funktion eingebaut:

C#:
public static void WriteToLog(string _line)
        {
            FileHelper fh = new FileHelper();

            StackTrace stackTra = new StackTrace();
            ParameterInfo[] pi = stackTra.GetFrame(1).GetMethod().GetParameters();

            string MethodName = stackTra.GetFrame(1).GetMethod().Name;
            string ClassName = stackTra.GetFrame(1).GetMethod().ReflectedType.Name;
            string Parameters = "";

            for (int i = 0; i < pi.Length; i++)
            {
                Parameters += pi.GetValue(i);
                if (i < pi.Length - 1)
                {
                    Parameters += ",";
                }
            }

            _line = String.Format("[{0}] {1}.{2}({3}): {4}", DateTime.Now, ClassName, MethodName,Parameters, _line);
            fh.AppendToFile(fh.GetAppPath()+"\\debug.txt", _line);
        }
Aber nach wie vor bekomme ich immer und immer wieder den Fehler.
An anderen Rechner klappt es, habe ich eben auch extra nochmals getestet.

Ich verzweifle hier langsam echt.
Selbst mit meiner DebugLog-Funktion wird keine Fehlermeldung angezeigt.
 
Zuletzt bearbeitet:
ctor ist der Konstruktor der Klasse. Dort passiert irgendwas, dass siese Exception auslöst.

Gruß
MCoder
Ah okay, das wusste ich nicht. Dennoch funktioniert nix, obwohl ich im Contructor sage, dass der was loggen soll:
C#:
public DatabaseHelper(String _DatabaseFile = "OfflineDB.db")
        {
            try
            {
                SetConnection(FileHelper.GetApplicationsPath() + @"\" + _DatabaseFile);
                sql_con.Open();
                generateTables();
            }
            catch (Exception ex)
            {
                DebugHelper.WriteToLog(ex.Message.ToString(), FileHelper.GetApplicationsPath() + @"\" + _DatabaseFile);
            }
        }
 
Hey, ok,

dann kann man ja schon mal viel ausschließen ^^

Leider kenn ich die FileHelper_Klasse nicht, deswegen folgende Frage: Erstellt der FileHelper die Datei, wenn Sie nicht vorhanden ist, mit der Methode "AppendToFile"?

Das ist ehrlich gesagt das Einzige was mir so auf die Schnelle noch einfällt.

Viele Grüße
 
Ja also daran kann es nicht liegen weil der Debugpfad immer da ist.
Vorallem tritt der Fehler im Kontruktor der Klasse "DatabaseHelper" auf. Den hab ich oben gepostet.
 
Hm, dann bleibt Dir wohl nichts anderes übrig, als den ganzen Code zu posten.

Diese Überladung fehlt:

C#:
DebugHelper.WriteToLog(ex.Message.ToString(), FileHelper.GetApplicationsPath() + @"\" + _DatabaseFile);

Folgende Methoden im Konstruktor:
C#:
                SetConnection(FileHelper.GetApplicationsPath() + @"\" + _DatabaseFile);
                //...
                generateTables();

Abschließend, die Initialisierung der Variable "sql_con".

Das sollte dann alle Member-Variablen beinhalten, da nicht viel als Parameter übergeben wird.


Viele Grüße


Edit:
Folgendes finde ich persönlich nicht so gut, aber da spalten sich glaub ich die Meinungen. Ich arbeite sehr ungern mit absoluten Pfadangaben, vielleicht stellt diese Methode für genau "den einen Computer" ein Problem dar:
C#:
FileHelper.GetApplicationsPath()

Ist nur eine Vermutung, aber ich persönlich würde mit relativen Pfadangaben arbeiten, wenn's geht.
 
Zuletzt bearbeitet von einem Moderator:
Also den ApplicationPath hatte ich erst nachträglich eingefügt weil ich die Befürchtung hatte, dass das eventuell Probleme gibt.
Ich werd mal deinen Vorschlag mit der Member-Variable einbauen, vllt erledigt sich das dann schon von alleine, aber ich fürchte fast nicht. Werde mir zudem gleich auch nochmal ne Win7 x64 VmWare aufsetzen und das da auch nochmal testen :S
 
Ich vermute mal es fehlt eine referenzierte DLL.
Ansonsten könnte es auch sein das die DLL an sich im ***** ist oder die Platte (läst sich dazu was im EventLog erkennen?)

Ansosnten mal von der CurrentDomain UnhandledException und von Application ThreadException abonnieren und mal schauen ob die ev. mehr sagen.
 
Zurück