2016-04-08 25 views
-1

Sınamada bir programım var - sadece birkaç masaüstünde çalışıyor - bazen Windows başlangıçta çok garip davranıyor.C# Windows üzerinde çalışan program Garip bir şekilde davranıyor Başlangıç ​​

programı bu başlar:

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

formu aslında sistem tepsi minimize başlar ve Yük aşağıdaki gibi Bildirim İkon ipucunu ayarlamak için _nicText kullanır:

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

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

Ben programı lo çalıştırırsanız şu şekildedir:

Kaydedici sınıftır cally, sürüm bilgisi için (0.0) alıyorum, aksi halde tam bir sürüm edinin (1.0.0.31 şu anda)

Ancak, başlangıçta bazen kullanıcı sürümüne (0.0) sahip olacağım durumlarda günlük dosyasına yazılmadı.

Şu anki tek tahminim, uygulamanın Windows'a hazır olmadan başlamasıdır (sadece kör bir tahmin). Bu olur mu? Eğer öyleyse, Windows hazır olana kadar gecikmek için herhangi bir yolu var mı? Başka bir şey mi eksik?

+2

Buradaki cevap hiç yardımcı değil mi? http://stackoverflow.com/questions/5332544/returning-clickonce-version-doesnt-work-when-launching-application-on-startup-f – Andy

+0

Kasten gösterilen (0, 0) çok kullanışlı değildir. Dolarlar için bazı kullanıcılar, exe'yi ağ konumundan kopyalarken daha iyi çalıştıklarını anladılar. Eksik günlük dosyası girişleri, eski bir sürümü veya yutma istisnalarını kopyalayarak açıklanmaya eğilimlidir. –

+0

Hatalı dizine baktığınız için günlük dosyasına hiçbir şey yazılmadığından şüpheleniyorum. (Günlük dosya adınız bir yol içermez, bu nedenle geçerli dizinin ne olduğu olursa olsun oluşturulur.) –

cevap

0

Soruna neden olan kod, ilk soruma gönderdiğim sırada değildi. Kullanıcı Hans Passant tarafından işaret edildiği gibi, sorun aslında programımın başlama şekliydi.

Başlangıçta, bu şimdiye kadar başlatmak için programı ayarlayarak nasıl oldu:

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

kod okuduktan sonra Returning ClickOnce version doesn't work when launching application on startup from the Windows Registry de, şimdi olduğu için kodumu değişti:

Şimdi
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); 
} 

, exe'yi başlangıçta doğrudan çalıştırmak yerine, sürüm bilgilerini doğru şekilde işleyen ClickOnce bağlantısını çalıştırıyor.

Yardım için tekrar Hans Passant'a teşekkürler!

İlgili konular