ソフトウェアの自動更新を達成するためにC#メソッド

本論文では、ソフトウェアの自動更新を達成するためにC#の方法を用いた例を分析し、それは学習とリファレンスの価値がある、非常に便利な機能です。次のとおりです。

問題の概要:

長い間、最終的にはプログラマの大半は、クライアント/サーバーを使用するか、またはブラウザ/サーバ・アーキテクチャの議論を使用することで、これらの引数、C / Sの構造差のプログラムの保守性、レイアウトの難しさは、便利な、高いメンテナンスコストをアップグレードされています非常に重要な要素。多くの企業ユーザーがありますが、それは、C / Sの使用放棄はこのためであります ただし、アプリケーションがうまくその機能を達成するためにC / Sの構造を使用しなければならないとき、どのように我々はクライアントの展開と自動エスカレーションを解決するのですか?展開は非常に簡単です、ただ難易度が自動アップグレード、新しいバージョンがリリースされるたびにということで、にインストーラをクリックしてください。私たちの目標は単純ですさて、私たちは、特定のアプリケーションの開発とは何の関係が自動的にシステムを再利用することができません更新します。今私はC#で書かれた自動アップグレードシステムは皆のための再利用可能な一連のです提供します。

2.難易自動的に既存のソフトウェア実装をアップグレード

 まず、リモートサーバー上の最新情報を見つけるために、アプリケーションは、ネットワークプログラミング、簡単なアプリケーションと通信サーバプロトコルを必要とするネットワークを照会する方法を持っていなければなりません。
 第二は、ダウンロードにあります。ルックスをダウンロードネットワーキングの問題を検討する必要はありませんが、ユーザーによって要求されたファイルをダウンロードして検討し、ユーザーの同意なしに大容量のファイルをダウンロードしてください。フレンドリー自動的にアップデートをダウンロードするには、残りの帯域幅を使用するアプリケーションを更新。幸いなことに、我々は解決策を持っている、それは簡単に聞こえるが、それは技術的な問題です。
 第三の考慮事項は、元のアプリケーションプロセスを置き換えるために、新しいアプリケーションを使用することです。より興味深い質問、それはシステムから身を削除する実行するコードを必要とするため、この機能を実現するには、いくつかの方法がある[5]は、このプログラムは、日付番号の新旧バージョンを比較することで、アプリケーションの主要な新バージョンの機能を置き換えるために実装されています。

3.オンラインソフトウェアの自動アップグレードの原則

 二つのプログラムを書く、1はメインのプログラムです。このプログラムは、アップグレード、すべてのアップグレードのタスクが完了しているアップグレードプロセスによって処理されています。
 。①一時フォルダに新しいメインプログラムを(もちろん、などのサポートライブラリファイル、XML設定ファイルを、含まれます)ダウンロードし、Webサイトへのアップグレードプログラムコネクト、アップグレードプログラムを起動;
 。②プログラムの新バージョンでは、サーバー側のXML設定ファイルを取得するためにアップグレード更新されたバージョン番号または日付やファイルサイズ、
 ③最新の更新日時やバージョン番号やファイルサイズを取得するために、既存のクライアントアプリケーションをアップグレードするには、両者を比較し、アップグレードプロセスは、最新のプログラムの元の日付よりも大きいことが判明した場合日付は、ユーザーがアップグレードするように指示されているかどうか、または最新バージョンの既存のバージョンを比較使用され、ユーザーが促されているかどうかの最新の発見は、アップグレードする、それはまた、ファイルサイズ、ファイルサイズのアップグレードプログラムが古いバージョンより大きく見られるような他の属性と比較しました。ユーザーがアップグレードするように指示されたプログラムのサイズ。本論文では、アップグレードを促す数を更新し、古いバージョンと新しいバージョンの使用を比較します。
 。④あなたがアップグレードすることを選択した場合、あなたは一括ダウンロードのドキュメントを開始するために、ファイルのリストをダウンロードして取得します。
 。⑤アップグレードプログラムの検出古い主な活動かどうか、古い主な活動が閉じている場合は、
 。⑥旧メインプログラム、一時的なコピーを削除適切な場所にフォルダ内のファイル;
 。⑦状態がアクティブである場合、新しいメインプログラムが開始され、メインプログラムの状態をチェックしてください。
 ⑧クローズドアップグレードは、アップグレードは完了です。

C#の持つ重要なステップのオンライン・アップグレードを実装する4

ここで私は、主にアップグレード版をダウンロードする必要性を検出するために、日付情報を使用します。

①。XML設定ファイルを準備します

名前AutoUpdater.xml、アップグレードするアップグレード、表示情報が必要とのテンプレートとして機能します。
名前AutoUpdater.xml、アップグレードするアップグレード、表示情報が必要とのテンプレートとして機能します。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?xml version="1.0"?> //xml版本号

<AutoUpdater>

<URLAddres URL="http://192.168.198.113/vbroker/log/"/>//升级文件所在服务器端的网址

<UpdateInfo>

<UpdateTime Date = "2005-02-02"/> //升级文件的更新日期

<Version Num = "1.0.0.1"/> //升级文件的版本号

</UpdateInfo>

<UpdateFileList> //升级文件列表

<UpdateFile FileName = "aa.txt"/> //共有三个文件需升级

<UpdateFile FileName = "VB40.rar"/>

<UpdateFile FileName = "VB4-1.CAB"/>

</UpdateFileList>

<RestartApp>

<ReStart Allow = "Yes"/> //允许重新启动应用程序

<AppName Name = "TIMS.exe"/> //启动的应用程序名

</RestartApp>

</AutoUpdater>

// XMLバージョン
//アップグレードファイルサーバのURL
//更新日アップグレードファイル
のアップグレードファイルの//バージョン番号
//ファイルのリストを更新
// 3つの文書がありますアップグレードする必要がある
//アプリケーションの再起動を許可
//開始をアプリケーション名

 サーバのアドレスは、文書をアップグレードする更新されたドキュメントをアップグレードすることができ、上記のXMLドキュメントから、ファイルのリストは、3つの文書の合計をアップグレードするここで、アップグレードする必要があります。aa.txt、VB40.rar、VB4-1.CAB。そして、許可するかどうかは、アプリケーションを再起動し、アプリケーション名を再起動します。

②。クライアントアプリケーションとサーバー側のアップグレードプログラム最終更新日時を取得します。

利用可能な()関数は、GetTheLastUpdateTimeによって実装されます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

private string GetTheLastUpdateTime(string Dir)

{

string LastUpdateTime = "";

string AutoUpdaterFileName = Dir + @"\AutoUpdater.xml";

if(!File.Exists(AutoUpdaterFileName))

return LastUpdateTime;

//打开xml文件

FileStream myFile = new FileStream(AutoUpdaterFileName,FileMode.Open);

//xml文件阅读器

XmlTextReader xml = new XmlTextReader(myFile);

while(xml.Read())

{

if(xml.Name == "UpdateTime")

{

//获取升级文档的最后一次更新日期

LastUpdateTime = xml.GetAttribute("Date");

break;

}

}

xml.Close();

myFile.Close();

return LastUpdateTime;

}

オープンXmlTextReaderはXML文書を通じて、最後のサーバー更新ファイルの更新時間である日に対応する値を、取得するように更新時間をお読みください。

関数は、達成するために呼び出します。

1

2

3

4

5

6

//获取客户端指定路径下的应用程序最近一次更新时间

string thePreUpdateDate = GetTheLastUpdateTime(Application.StartupPath);

Application.StartupPath指客户端应用程序所在的路径。

//获得从服务器端已下载文档的最近一次更新日期

string theLastsUpdateDate = GetTheLastUpdateTime(theFolder.FullName);

theFolder.FullName指在升级文档下载到客户机上的临时文件夹所在的路径。

③。日付の比較

クライアント・アプリケーションと最終更新サーバー側のアップグレードプログラムの日は、最後の日付の比較を更新しました。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//获得已下载文档的最近一次更新日期

string theLastsUpdateDate = GetTheLastUpdateTime(theFolder.FullName);

if(thePreUpdateDate != "")

{

//如果客户端将升级的应用程序的更新日期大于服务器端升级的应用程序的更新日期

if(Convert.ToDateTime(thePreUpdateDate)>=Convert.ToDateTime(theLastsUpdateDate))

{

MessageBox.Show("当前软件已经是最新的,无需更新!","系统提示",MessageBoxButtons.OK,MessageBoxIcon.Information);

this.Close();

}

}

this.labDownFile.Text = "下载更新文件";

this.labFileName.Refresh();

this.btnCancel.Enabled = true;

this.progressBar.Position = 0;

this.progressBarTotal.Position = 0;

this.progressBarTotal.Refresh();

this.progressBar.Refresh();

//通过动态数组获取下载文件的列表

ArrayList List = GetDownFileList(GetTheUpdateURL(),theFolder.FullName);

string[] urls = new string[List.Count];

List.CopyTo(urls, 0);

前者が後者よりも小さい場合は、動的配列を経由して、ダウンロードファイルのリストを取得、ファイルのダウンロードを開始し、日付と、サーバー側のアプリケーションは、アプリケーションの日付をダウンロードして、前者が後者よりも大きい場合には、更新されないようにクライアントをアップグレードします。

()関数はBatchDownloadによって実現されます。古い主な活動が閉じている場合、古い主な活動かどうかをプログラムの検出をアップグレードし、適切な場所に一時フォルダ内のファイルをコピーし、古いメインプログラムを削除し、状態がアクティブである場合には、メインプログラムの状態を確認し、新メインプログラムを起動します。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

private void BatchDownload(object data)

{

this.Invoke(this.activeStateChanger, new object[]{true, false});

try

{

DownloadInstructions instructions = (DownloadInstructions) data;

//批量下载

using(BatchDownloader bDL = new BatchDownloader())

{

bDL.CurrentProgressChanged += new DownloadProgressHandler(this.SingleProgressChanged);

bDL.StateChanged += new DownloadProgressHandler(this.StateChanged);

bDL.FileChanged += new DownloadProgressHandler(bDL_FileChanged);

bDL.TotalProgressChanged += new DownloadProgressHandler(bDL_TotalProgressChanged);

bDL.Download(instructions.URLs, instructions.Destination, (ManualResetEvent) this.cancelEvent);

}

}

catch(Exception ex)

{

ShowErrorMessage(ex);

}

this.Invoke(this.activeStateChanger, new object[]{false, false});

this.labFileName.Text = "";

//更新程序

if(this._Update)

{

//关闭原有的应用程序

this.labDownFile.Text = "正在关闭程序....";

System.Diagnostics.Process[]proc=System.Diagnostics.Process.GetProcessesByName("TIMS");

//关闭原有应用程序的所有进程

foreach(System.Diagnostics.Process pro in proc)

{

pro.Kill();

}

DirectoryInfo theFolder=new DirectoryInfo(Path.GetTempPath()+"JurassicUpdate");

if(theFolder.Exists)

{

foreach(FileInfo theFile in theFolder.GetFiles())

{

//如果临时文件夹下存在与应用程序所在目录下的文件同名的文件,则删除应用程序目录下的文件

if(File.Exists(Application.StartupPath + \\"+Path.GetFileName(theFile.FullName)))

File.Delete(Application.StartupPath + "\\"+Path.GetFileName(theFile.FullName));

//将临时文件夹的文件移到应用程序所在的目录下

File.Move(theFile.FullName,Application.StartupPath + \\"+Path.GetFileName(theFile.FullName));

}

}

//启动安装程序

this.labDownFile.Text = "正在启动程序....";

System.Diagnostics.Process.Start(Application.StartupPath + "\\" + "TIMS.exe");

this.Close();

}

}

リリース6元記事 ウォンの賞賛189 ビュー280 000 +

おすすめ

転載: blog.csdn.net/newbie_xymt/article/details/102571848