在Windows Startup上运行的c#程序行为异常

在Windows Startup上运行的c#程序行为异常,c#,startup,system-tray,C#,Startup,System Tray,我有一个正在测试的程序——只在少数几台台式机上运行——它在Windows启动时有时会出现非常奇怪的行为 该计划从以下内容开始: public frmClient() { _version = ApplicationDeployment.IsNetworkDeployed ? ApplicationDeployment.CurrentDeployment.CurrentVersion : _version; _nicText = string.Format("My Program

我有一个正在测试的程序——只在少数几台台式机上运行——它在Windows启动时有时会出现非常奇怪的行为

该计划从以下内容开始:

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();
}
表单实际上开始最小化到系统托盘,并在加载时使用_nicText设置通知图标的工具提示,如下所示:

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();
    }
}
记录器类别如下所示:

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();
    }
}
如果我在本地运行该程序,我将获得(0.0)版本信息,否则我将获得完整版本(当前为1.0.0.31)

但是,有时在启动时,我会让一个用户显示(0.0)作为一个版本,在这些情况下,没有任何内容写入日志文件


目前我唯一的猜测是,应用程序是在Windows准备就绪之前启动的(只是瞎猜)。这会发生吗?如果是这样,我有没有办法推迟到Windows准备就绪?我还遗漏了什么吗?

导致问题的代码不在我最初问题中发布的内容中。正如用户Hans Passant所指出的,问题实际上在于我的程序的启动方式

最初,我是这样设置程序启动的:

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());
}
在阅读上的代码后,我现在将代码更改为:

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,而是运行ClickOnce链接,该链接似乎可以正确处理版本信息


再次感谢汉斯·帕桑的帮助

这里的答案有帮助吗?故意显示(0,0)不是很有用。美元到甜甜圈一些用户发现,当他们从网络位置复制exe时,效果会更好:)缺少日志文件条目的原因往往是他们复制了旧版本或吞咽了异常。我怀疑没有向日志文件写入任何内容,因为您在错误的目录中查找。(您的日志文件名不包含路径,因此将在当前目录中创建它。)@HansPassant就是这样。启动程序正在直接运行exe。如果你加上这个作为答案,我会记下来的。