我有一个测试程序 - 只运行在几个桌面上 - 有时会在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);
}
}
Logger类如下:
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)
但是,有时在启动时我会将用户show(0.0)作为版本,并且在这些情况下会将NOTHING写入日志文件。
目前我的唯一猜测是应用程序在Windows准备好之前就开始了(只是一个盲目的猜测)。这会发生吗?如果是这样,在Windows准备好之前,有什么方法可以延迟吗?我错过了别的什么吗?
答案 0 :(得分:0)
导致问题的代码并非我在初始问题中发布的内容。正如用户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());
}
在Returning ClickOnce version doesn't work when launching application on startup from the Windows Registry阅读代码后,我现在将代码更改为:
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链接,它似乎正确处理版本信息。
再次感谢Hans Passant的帮助!