我需要通過Web服務使我的CF應用程序自我更新。 我在2003年的MSDN上發現了一篇文章,對它進行了很好的解釋。不過,我想在這裏談談實踐。以前是否有人真的做過,或者每個人都依賴第三方解決方案?自我更新.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();
}
}
如果你想使用一個第三方組件,看看AppToDate通過的MoDaCo的人開發的。
我指的是實際上。 http://msdn.microsoft.com/en-us/library/aa446487.aspx 這既是,但它是一篇舊文章,我只是想知道是否有人有實際經驗。 – sarsnake 2009-02-25 18:31:19