2016-04-08 13 views
-1

Ich habe ein Programm im Test - nur auf ein paar Desktops ausgeführt -, die manchmal sehr seltsames Verhalten beim Start von Windows gibt.C# Programm, das auf Windows startet Startup Verhalten seltsam

Das Programm beginnt mit diesem:

public frmClient() 
{ 
    _version = ApplicationDeployment.IsNetworkDeployed ? ApplicationDeployment.CurrentDeployment.CurrentVersion : _version; 
    _nicText = string.Format("My Program ({0})", _version.ToString()); 

    Logger.LogToFile(string.Format("Startup - Build: {0}, Major: {1}, MajorRevision: {2}, Minor: {3}, MinorRevision: {4}, Revision {5}", 
     _version.Build, 
     _version.Major, 
     _version.MajorRevision, 
     _version.Minor, 
     _version.MinorRevision, 
     _version.Revision)); 

    InitializeComponent(); 
} 

Die Form tatsächlich beginnt die Taskleiste minimiert und in dem Load verwendet er die _nicText den Tooltip des Notification-Symbol wie folgt festzulegen:

private void frmClient_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     Logger.LogToFile("frmClient.frmClient_Load"); 

     nicMain.Text = _nicText + " - NOT CONNECTED"; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

die Logger-Klasse ist wie folgt:

public static class Logger 
{ 
    public static void LogToFile(string LogMessage) 

    { 
     StreamWriter log; 

     if (!File.Exists("logfile.txt")) 
     { 
      log = new StreamWriter("logfile.txt"); 
     } 
     else 
     { 
      log = File.AppendText("logfile.txt"); 
     } 

     log.WriteLine(DateTime.Now.ToString("yyyyMMddHHmmss") + " - " + LogMessage); 
     log.Close(); 
    } 
} 

Wenn ich das Programm lo laufen Natürlich bekomme ich (0.0) für die Versionsinformation, ansonsten bekomme ich eine Vollversion (1.0.0.31 aktuell)

Allerdings habe ich manchmal beim Start eine Usershow (0.0) als Version, und in diesen Fälle, in denen NICHTS in die Protokolldatei geschrieben wird.

Derzeit ist meine einzige Vermutung, dass die Anwendung gestartet wird, bevor Windows bereit ist (nur eine blinde Schätzung). Passiert das? Wenn ja, kann ich etwas verzögern, bis Windows bereit ist? Vermisse ich etwas anderes?

+2

Hilft die Antwort hier überhaupt? http://stackoverflow.com/questions/5332544/returning-clickonce-version-doesnt-work-when-launching-application-on-startup-f – Andy

+0

Absichtlich zeigen (0, 0) ist nicht sehr nützlich. Dollars zu Donuts einige Benutzer haben herausgefunden, dass es besser funktioniert, wenn sie die Exe vom Netzwerk-Standort kopieren :) Fehlende Log-Datei-Einträge neigen dazu, dass sie eine alte Version kopieren oder Ausnahmen verschlucken. –

+0

Ich vermute, dass nichts in die Protokolldatei geschrieben wird, weil Sie in das falsche Verzeichnis suchen. (Ihr Protokolldateiname enthält keinen Pfad, sodass er in dem aktuellen Verzeichnis erstellt wird.) –

Antwort

0

Der Code, der das Problem verursachte, war nicht in dem, was ich in meiner ersten Frage geschrieben habe. Wie Hans Passant darauf hingewiesen hat, ging es eigentlich um die Art und Weise, wie mein Programm gestartet wurde. Ursprünglich

, das war, wie ich einstellen, das Programm zu starten:

RegistryKey regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); 

if (regKey.GetValue("MyKey") == null || regKey.GetValue("MyKey").ToString() != Application.ExecutablePath.ToString()) 
{ 
    regKey.SetValue("MyKey", Application.ExecutablePath.ToString()); 
} 

Nach dem Lesen des Codes auf Returning ClickOnce version doesn't work when launching application on startup from the Windows Registry, ich habe jetzt geändert meinen Code zu sein:

string compName = "MyCompany"; 
string keyName = "MyKey"; 
string allProgramsPath = Environment.GetFolderPath(Environment.SpecialFolder.Programs); 
string shortcutPath = Path.Combine(allProgramsPath, compName); 
shortcutPath = Path.Combine(shortcutPath, keyName) + ".appref-ms"; 

RegistryKey regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); 

if (regKey.GetValue(keyName) == null || regKey.GetValue(keyName).ToString() != shortcutPath) 
{ 
    regKey.SetValue(keyName, shortcutPath); 
} 

Jetzt, Anstatt die exe direkt beim Start auszuführen, wird der ClickOnce-Link ausgeführt, der die Versionsinformationen korrekt zu behandeln scheint.

Danke nochmal Hans Passant für die Hilfe!