.Net 3.5 Anwendung läuft auf Zielcomputer nicht

Eroli

Erfahrenes Mitglied
Hallöchen zusammen,

ich bin gerade dabei ein ganz einfaches Programm zum Verwalten von Rechnungen zu schreiben. Dazu benutze ich unter Anderem MS Chart (Windows.Forms.DataVisualization) um die Daten schön zu visualisieren. Das Programm benutzt das .NET Framework 3.5.

Auf meinem Entwicklungsrechner (Win 7) läuft alles ohne Probleme. Dort sind alle Frameworks bis .NET 4.0 Client Profile installiert.
Der Zielrechner, auf dem das Programm leider nicht läuft arbeitet mit Windows Vista und hat .NET Framework 3.5 SP1 installiert.

Screenshots von der Fehlermeldung habe ich euch mal angehangen. Die Fehlermeldung kommt übrigens WÄHREND des Startvorgangs noch bevor die MainForm oder Sonstiges angezeigt wird. Im Programm selbst wird zur Laufzeit eine Datei gelesen und beschrieben. Dort habe ich alle Exceptions per Logging-Funktion abgefangen, aber daran scheint es nicht zu liegen, denn der Log bleibt leer. Es scheint, als würde das Programm erst beim starten selbst merken, dass ihm eine Datei fehlt (FileNotFoundException, siehe Screenshot 2).

Nun einige Dinge, die ich bereits getestet habe:
  1. Simples Testprogramm unter .NET 3.5 erstellt --> läuft auf dem Zielrechner
  2. Simples Testprogramm unter .NET 3.5 mit MS Chart erstellt (DataVisualization-DLL als lokale Kopie ins Augabeverzeichnis kopiert) --> läuft auf dem Zielrechner
  3. In VisualStudio angegeben, dass der DataVisualization-Verweis für MSChart als lokale Kopie ins Ausgabeverzeichnis kopiert werden soll --> Keine Besserung

    Dort kann man auch noch ein Einstellungsfeld "Spezifische Version" ändern, leider kann ich damit nichts anfangen. Die Beschreibung dazu sagt: "Gibt an, ob diese Assembly ohne Berücksichtigung der Regeln für die Festlegung von Zielversionen für die Assemblyauflösung aufgelöst werden kann" - Bringt mir diese Einstellung irgendetwas? Auf dem Zielrechner ist MS Chart auf jeden Fall nicht installiert, daher ist eine lokale Kopie der DLL Pflicht, doch mit dieser Einstellung kann ich nichts anfangen :-/

So - und nun weiß ich nicht weiter. Habt ihr vielleicht irgendwelche Ideen? Sollte ich das Programm vielleicht im .NET 3.5 Client Profile kompilieren? Was ist das überhaupt? Was kann ich sonst noch testen?

Wäre es vielleicht am einfachsten das Projekt auf .NET 4.0 umzustellen und dieses dann auf dem Zielrechner zu installieren?

Vielen Dank für JEDE Hilfe :-)

PS: Im Moment wird SP1 für Vista auf dem Zielrechner installiert, aber ob das hilft, weiß ich noch nicht...

EDIT: Bilder vergessen :-D
 

Anhänge

  • 1.png
    1.png
    166,1 KB · Aufrufe: 45
  • 2.png
    2.png
    169,2 KB · Aufrufe: 54
Zuletzt bearbeitet:
Kannst du mal den Code zeigen, bei dem die Datei gelesen wird? Eine FileNotFoundException ist ja eigentlich ziemlich eindeutig: eine Datei kann nicht gefunden werden. Vielleicht läuft das Programm auf dem Zielrechner mit anderen Rechten und darf die Datei deswegen nicht öffnen (bzw. Vista gaukelt deinem Programm daher vor, dass die Datei gar nicht existiert)?
 
Der betreffende Code ist durch try-Catch-Blöcke gesichert und daher müsste es einen Logeintrag geben, welcher aber nicht da ist. Ich habe auch schon getestet, das Programm als Administrator laufen zu lassen - auch ohne Erfolg. Bei Windows 7 auf meinem Entwicklungsrechner ist das alles kein Problem und die Rechteverwaltung müsste da ja ähnlich sein...

Wenn du trotzdem den Code zum Lesen der Datei haben willst, kann ich dir diese gerne noch raussuchen, aber ich denke der Fehler liegt nicht daran...
 
Das kann ich natürlich probieren, aber es wird auch daran nicht liegen. Die Exception wird ja NICHT abgefangen, sonst würde es nicht diese Windows-Fehlermeldung geben und sie würde geloggt werden. Alle kritischen Stellen sind im Programm mit Try-Catch-Blöcken umgeben. Stattdessen startet das Programm gar nicht erst.

Ich tippe hier auf einen fehlenden Verweis - nämlich die DataVisualization, welche man ja zusätzlich aus dem Internet herunterladen musste. Ich dachte ich löse das Problem, indem ich die DLL ins Ausgabeverzeichnis kopieren lasse, aber das half nicht und jetzt bin ich ratlos... :-(
 
Vermutung: Die Exception tritt auf, weil die Logging-Klasse sie wirft. Das würde erklären, warum nichts geloggt werden kann.

Überprüf den Code der Logging-Klasse noch einmal, oder poste sie hier.
 
Test-Logging-Ausgaben zum Beispiel als erste Zeile in meiner Funktion funktionieren aber ohne Probleme...

Habe das Projekt jetzt mit .NET 4.0 kompiliert und dieses Framework auch auf Vista installiert - keine Besserung...
Jetzt geh ich erstmal alle try-catch-blöcke durch...
 
Ichmuss mich entschuldigen, die Logging-Methode funktioniert auf dem Entwicklungsrechner, aber nicht auf dem Zielcomputer. Sie sieht wie folgt aus:

C#:
        private static void Log(String text)
        {
            using (FileStream stream = new FileStream(m_LogFilePath, FileMode.OpenOrCreate))
            {
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    StreamReader reader = new StreamReader(stream);
                    while (!reader.EndOfStream)
                    {
                        reader.ReadLine();
                    }
                    writer.WriteLine(string.Format("{0};\t{1}", DateTime.Now.ToString(), text));
                    writer.Flush();
                }
            }
        }

EDIT: Sorry, doch falscher Alarm: Habe die program.cs wie foglt geändert:

C#:
[STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Core.Log("test");
            //Application.Run(new MainForm());
        }

... und siehe da - es wird geloggt :-)
 
Zuletzt bearbeitet:
Hmm, das verstehe ich nicht ganz: Funktioniert die Applikation jetzt oder nur das Logging - also auch auf dem Zielrechner?

Warum ist die Funktion Log der Klasse Core eigentlich private? Sollte die nicht public static sein?

EDIT: Wenn die Logger-Klasse selbst auf eine Exception stößt, wird diese offensichtlich nirgends abgefangen. Evtl. solltest in diesem Fall auf Message-Boxen zurückgreifen? Das würde bedeuten, die Funktionen in der Logger-Klasse dürfen keine Exceptions werfen, alles muss dort abgefangen und an eine MessageBox übergeben werden. Dann hat man wenigstens einen Stacktrace und eine qualifizierte Meldung.
 
Zuletzt bearbeitet:
Sorry, ich kann wahrscheinlich nicht 100%ig genau auf dich eingehen, weil ich gerade voller Euphorie dabei bin den Fehler genauer einzugrenzen...

Gerade bin ich bei der MainForm beim Erstellen meiner UserControls. Sobald ich ein UserControl mit MS Chart einkommentiere, funktioniert das Programm nicht mehr:

C#:
public MainForm()
        {
            InitializeComponent();
            m_LoadingControl = new LoadingControl(this);
            m_OverviewControl = new OverviewControl(this);
            m_AddControl = new AddControl(this);
            //m_ViewMonthControl = new ViewMonthControl(this);
            //m_ViewYearControl = new ViewYearControl(this);
            m_PreferencesControl = new PreferencesControl(this);
            m_InfoControl = new InfoControl(this);

            //mainFormToolStripContainer.ContentPanel.Controls.Clear();
            //mainFormToolStripContainer.ContentPanel.Controls.Add(m_LoadingControl);
            //m_LoadingControl.Focus();

            //Core.Load();
        }

Und ja, natürlich soll die Logging-Funktion public sein - mein fehler ;-)

EDIT: Stimmt nicht - es liegt nur an einem Control...

EDIT2: Vielleicht stimmts doch... :-D Ich untersuche weiter :-D
 
Zuletzt bearbeitet:
Zurück