我需要通过网络服务让我的CF应用程序自我更新。 我从2003年在MSDN上发现了一篇很好解释的文章。不过,我想在这里练习一下。有人真的以前做过或者每个人都依赖第三方解决方案吗?
我被特别要求这样做,所以如果你知道任何提示/警告,任何信息都会受到赞赏。
谢谢!
答案 0 :(得分:2)
这相对容易。基本上,您的应用程序调用Web服务来将其版本与服务器上可用的版本进行比较。如果服务器版本较新,则应用程序将新EXE作为byte []数组下载。
接下来,因为您无法删除或覆盖正在运行的EXE文件,您的应用程序会将其原始EXE文件重命名为“MyApplication.old”(操作系统允许这样做,幸运的是)。然后,您的应用程序将下载的byte []数组保存在与原始EXE文件相同的文件夹中,并使用相同的原始名称(例如“MyApplication.exe”)。然后,您向用户显示一条消息(例如“检测到新版本,请重新启动”)并关闭。
当用户重新启动应用时,它将是他们正在启动的新版本。新版本删除旧文件(“MyApplication.old”),更新完成。
让应用程序更新而不需要用户重启是一个巨大的痛苦(你必须启动一个单独的进程来进行更新,这意味着一个单独的更新程序应用程序本身不能自动更新)和我从来没有能够100%可靠地工作。我从来没有客户抱怨所需的重启。
答案 1 :(得分:2)
我回答过同样的问题: How to Auto-Update Windows Mobile application
基本上你需要两个应用程序。
App1:启动实际应用程序,但也检查CAB文件(安装程序)。如果cab文件在那里,它将执行CAB文件。
App2:实际申请。它将调用Web服务,将版本号传递给服务,并在存在新版本时检索URL()。下载后,您可以选择安装cab文件并关闭。
一个问题:如果您有一个安装文件系统的文件,但无法覆盖(数据库文件,日志等),则需要两个单独的安装。
安装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()。Version.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();
}
}
答案 2 :(得分:1)
“自我更新”究竟是什么意思?如果您指的是配置或数据,那么Web服务应该可以正常运行。如果您正在谈论自动下载和安装自己的新版本,那就是另一回事了。
从Microsoft发现this可下载样本 - 看起来应该有所帮助。
答案 3 :(得分:0)
如果您想使用第三方组件,请查看由MoDaCo的人员开发的AppToDate。