0

これは、winforms vb.net アプリケーションです。いくつかの制限があるため、VS で利用可能な組み込みの clickOnce 更新を使用できません。したがって、アプリケーションの更新を処理するために、更新アプリを作成しました。電子メールの添付ファイルをダウンロードして処理します。アプリケーションのインストールフォルダーから古いファイルを削除し、更新されたファイルをそのフォルダーに移動することを含め、すべてがうまく機能します。

しかし、新しいファイルはアプリケーションにまったく影響を与えないようです。テストのために、アプリケーションの Form Load イベントに MessageBox.Show を配置しました。デバッグすると、アプリは VS にメッセージボックスを表示します。binフォルダーからアプリを実行したときと同様に..アップデーターアプリがファイルをコピーすると、ファイルはそこにありますが、サイコロは何も変更されず、アプリが読み込まれたときにメッセージボックスが表示されません。さらに問題を調査したところ、アプリケーション フォルダー内の置換対象のファイルを手動で削除し、更新用の zip ファイルの内容をそのフォルダーに解凍しました。アプリを起動すると、メッセージ ボックスが表示されます。 app を bin フォルダーから app フォルダーに直接移動することもできます。

これは、私がキャッチしていない以下の関数の舞台裏で何かが起こっていると私に信じさせます。なぜこれが失敗するのか?

     Function ApplyUpdates(ByVal c As Integer, ByVal e As List(Of MessagePart))
    Dim xxxxState As Boolean = False
    Dim _path As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles\"
    Dim d As Integer = 20

    xxxxState = isProcessRunning("xxxx")
    If xxxxState = True Then
        KillxxxxTask()
    End If

    For Each _S In System.IO.Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "XXXX\UpdateFiles")
        System.IO.File.Delete(_S)
    Next


    For Each att In e
        Dim y As Boolean = UnZip(att.FileName)
    Next

    For Each f In System.IO.Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles")
        Dim y As String = Path.GetExtension(f)
        Dim _fNM As String = Path.GetFileNameWithoutExtension(f)
        If y.Contains("ex0") Then
            My.Computer.FileSystem.RenameFile(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles" + "\" + _fNM + y, _fNM + "." + "exe")
            f = f.Replace("ex0", "exe")
        End If
        If y.Contains("dl0") Then
            My.Computer.FileSystem.RenameFile(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles" + "\" + _fNM + y, _fNM + "." + "dll")
            f = f.Replace("dl0", "dll")
        End If
        updating(d, "Copying File : " + f)
        d += 10
        Dim fName As String = Path.GetFileName(f)
    Next

        For Each S In System.IO.Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles")
            Dim _ofile As String = Path.GetFileName(S)
            If File.Exists("C:\XXXX\" + _ofile) Then
                File.Delete("C:\XXXX\" + _ofile)
            End If
            '  File.Copy(S, "C:\XXXX\" + _ofile, True)

        Next
        For Each S In System.IO.Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) + "\XXXX\UpdateFiles")
            Dim _ofile As String = Path.GetFileName(S)
            File.Move(S, "C:\XXXX\" + _ofile)

        Next
        updating(100, "Update Completed")

    Return Nothing
End Function
4

1 に答える 1

2

これは、Windows のファイル仮想化に非常によく似ています。

C:\Documents and Settings\<userName>\Application Dataとサブフォルダーでファイルを検索します 。そこにあると思います。

プロジェクトに app.manifest を含めない場合、Windows はプログラムをそれ自体から保護するためにこれを行います。Windows は、app.manifest がない限り、アプリケーションが UAC に対応していない古いレガシー アプリケーションであると想定します。拒否されたファイル アクセスによってアプリケーションがクラッシュするのを防ぐために、ファイル操作の実行を許可しますが、代わりにファイル操作を安全なローカル フォルダーに秘密裏にマップします。

app.Manifest を追加するだけです: Project Add -> New Item -> Application Manifest File

それはそれを行う必要があります。権限の昇格を要求する必要がある場合がありますが、詳細はすべて app.manifest ファイルにあります。

ファイル仮想化の詳細については、こちらの説明をご覧ください。これは大きな記事ですが、「仮想化プロセス」を Ctrl-Find すると、関連するセクションに移動します。

app.manifest の詳細については、この MSDN の記事を参照してください。

于 2012-09-20T01:22:19.290 に答える