0

あなたが私を助けてくれることを願っています。サーバーからの XML ファイルのダウンロードに基づいたプログラム アップデーターを構築しようとしています。

サーバーの XML ファイルには、現在のバージョン番号とインストーラーの場所が含まれているという考えです。アップデーターは、スタートアップ フォルダーにダンプされるか、サービスとしてインストールされます。

プログラムは、現在のバージョンの xml ファイルを正常に読み取って解析し、サーバーから xml ファイルを正常にダウンロードします。ただし、サーバーから新しくダウンロードしたファイルを解析しようとすると、エラーが発生します。

'IOException was unhandled' '別のプロセスで使用されているため、プロセスはファイル 'C:\Program Files (x86)\Test\ServerVersion.xml' にアクセスできません。

私が知る限り、これはプログラムの外部とプログラムの内部では当てはまりません。使用する前に、アクセスできる要素をすべて破棄したと思います。何かばかげたことをしたり、物事を正しく処理していませんか?

コードは次のとおりで、エラーは 52 行目のコメントでマークされています。

Imports System.IO
Imports System.Xml.XmlTextReader
Imports System.Net
Module Module1

Sub Main()
    Dim currentreader As Xml.XmlTextReader
    Dim serverreader As Xml.XmlTextReader
    Dim download As New WebClient
    Dim Version
    Dim Versionlocation
    Dim ServerVersion
    Dim Serverlocation
    Dim Failure As Boolean = False ' Will be used for retrys in the future'

    download = New WebClient

    Try
        If Not (System.IO.File.Exists("C:\Program Files (x86)\Test\ServerVersion")) Then
            download.DownloadFileAsync(New Uri("http://192.168.2.226/SampleApp_ServerSetup/UpdateVersion.xml"), "C:\Program Files (x86)\Test\ServerVersion.xml")
            download.Dispose()
        End If
    Catch ex As Exception
        Failure = True
        Console.WriteLine("error" & ex.Message)
    End Try

    currentreader = New Xml.XmlTextReader("C:\Program Files (x86)\Test\Version.xml")
    currentreader.WhitespaceHandling = Xml.WhitespaceHandling.None

    currentreader.Read()
    currentreader.Read()

    While Not currentreader.EOF
        currentreader.Read()

        If Not currentreader.IsStartElement Then
            Exit While
        End If

        Version = currentreader.ReadElementString("AvailableVersion")
        Versionlocation = currentreader.ReadElementString("ApplicationUrl")

    End While
    currentreader.Close()

    serverreader = New Xml.XmlTextReader("C:\Program Files (x86)\Test\ServerVersion.xml")
    serverreader.WhitespaceHandling = Xml.WhitespaceHandling.None

    Console.WriteLine("Current Version: " & Version & vbNewLine & "Version Url: " & Versionlocation)

    'error here'
    serverreader.Read()
    serverreader.Read()

    While Not serverreader.EOF
        serverreader.Read()

        If Not serverreader.IsStartElement Then
            Exit While
        End If

        ServerVersion = currentreader.ReadElementString("AvailableVersion")
        Serverlocation = currentreader.ReadElementString("ApplicationUrl")

    End While

    If ServerVersion > Version Then
        Console.WriteLine("New version available : " & ServerVersion)
    End If

    serverreader.Close()

End Sub

End Module

まだ作業中ですが、新しいバージョンの場所がわからない場合、インストーラーをダウンロードして実行するためのコードを記述してもあまり意味がありません。

ここで使用する場合、XML は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<VersionConfig>
<AvailableVersion>2.0.0.0</AvailableVersion>
<ApplicationUrl>http://192.168.2.226/EPI/2.0.0.0/</ApplicationUrl>
</VersionConfig>
4

1 に答える 1

1

DownloadFileAsyncではなく、DownloadFileを使用します。DownloadFileAsyncはブロックしないため、ダウンロードを開始して実行を継続します。非同期メソッドは、イベントを使用して処理されることを目的としているため、ダウンロードがバックグラウンドで続行されている間、メインスレッドで他の作業を実行し続けることができます。

于 2011-12-15T18:01:44.537 に答える