自我更新.net CF应用程序
我需要通过Web服务使我的CF应用程序自我更新。 我在2003年的MSDN上发现了一篇文章,对它进行了很好的解释。不过,我想在这里谈谈实践。以前是否有人真的做过,或者每个人都依赖第三方解决方案?自我更新.net CF应用程序
我已被特意要求这样做,所以如果你知道任何提示/警告,任何信息表示赞赏。
谢谢!
“自我更新”是什么意思?如果你指的是配置或数据,那么Web服务应该很好。如果你正在谈论自动下载和安装自己的新版本,这是一个不同的故事。
找到this从Microsoft下载的示例 - 看起来应该有所帮助。
这样做相对容易。基本上,您的应用程序会调用Web服务来将其版本与服务器上提供的版本进行比较。如果服务器版本较新,您的应用程序将新的EXE作为byte []数组下载。
接下来,由于您无法删除或覆盖正在运行的EXE文件,因此您的应用程序会将其原始EXE文件重命名为“MyApplication.old”(操作系统允许此操作)。然后,您的应用程序将下载的byte []数组保存在与原始EXE文件相同的文件夹中,并使用相同的原始名称(例如“MyApplication.exe”)。然后您向用户显示一条消息(例如“检测到新版本,请重新启动”)并关闭。
当用户重新启动应用程序时,它将是他们开始的新版本。新版本删除旧文件(“MyApplication.old”),更新完成。
让应用程序更新本身而不需要用户重启是一个巨大的痛苦(你必须启动一个单独的进程来完成更新,这意味着一个单独的更新应用程序本身不能自动更新)我从来没有能够100%可靠地工作。我从来没有让客户抱怨需要重新启动。
感谢您的答案,在我看来,我将不得不自己更新。原因是因为我们的用户不是非常精明,并且可能不会更新应用程序,最终会发生什么,我们将在各地都有不同的版本 - 这肯定会让人感到痛苦。我宁愿在早期阶段自动处理它。 – sarsnake 2009-06-08 17:15:08
我问这个同样的问题而回: How to Auto-Update Windows Mobile application
基本上你需要两个应用程序。
App1:启动实际应用程序,但也检查CAB文件(安装程序)。如果cab文件在那里,它会执行CAB文件。
App2:实际应用。它将调用Web服务,将版本号传递给服务,并在存在新版本时检索URL()。下载后,您可以选择安装cab文件并关闭。
一个问题:如果你有一个安装在文件系统上的文件,但不能覆盖(数据库文件,日志等),则需要两次单独安装。
要安装的驾驶室:查找wceload.exe http://msdn.microsoft.com/en-us/library/bb158700.aspx
private static bool LaunchInstaller(string cabFile)
{
// Info on WceLoad.exe
//http://msdn.microsoft.com/en-us/library/bb158700.aspx
const string installerExe = "\\windows\\wceload.exe";
const string processOptions = "";
try
{
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = installerExe;
processInfo.Arguments = processOptions + " \"" + cabFile + "\"";
var process = Process.Start(processInfo);
if (process != null)
{
process.WaitForExit();
}
return InstallationSuccessCheck(cabFile);
}
catch (Exception e)
{
MessageBox.Show("Sorry, for some reason this installation failed.\n" + e.Message);
Console.WriteLine(e);
throw;
}
}
private static bool InstallationSuccessCheck(string cabFile)
{
if (File.Exists(cabFile))
{
MessageBox.Show("Something in the install went wrong. Please contact support.");
return false;
}
return true;
}
要获取的版本号:Assembly.GetExecutingAssembly()的GetName()版本。的ToString()
要下载驾驶室:
public void DownloadUpdatedVersion(string updateUrl)
{
var request = WebRequest.Create(updateUrl);
request.Credentials = CredentialCache.DefaultCredentials;
var response = request.GetResponse();
try
{
var dataStream = response.GetResponseStream();
string fileName = GetFileName();
var fileStream = new FileStream(fileName, FileMode.CreateNew);
ReadWriteStream(dataStream, fileStream);
}
finally
{
response.Close();
}
}
我指的是实际上。 http://msdn.microsoft.com/en-us/library/aa446487.aspx 这既是,但它是一篇旧文章,我只是想知道是否有人有实际经验。 – sarsnake 2009-02-25 18:31:19