ClickOnceによる更新でローカルデータを引き継ぐ方法

ClickOnceによる配置では、インストールするフォルダを指定することはできません。「%SYSTEMDRIVE%\Documents and Settings\<ユーザー名>\Local Settings\Apps\2.0」の下にフォルダが作成され、インストールされます。新しいバージョンが発行された場合、同じフォルダに更新されたファイルがダウンロードされてくるわけではなく、新しいバージョンのフォルダにすべてのファイルがインストールされます。これは、元のバージョンに戻すことができなければいけないので、当然といえば当然です。
ですが、この場合アプリケーションと同じフォルダにローカルデータとして保存するという手法は使えません。アップデートすると保存していたローカルデータを使用することができなくなってしまいます。

そこで、分離ストレージを使います。ノータッチデプロイメントのときはクライアントリソースへのアクセス制限を回避するために分離ストレージを使いましたが、ClickOnceでは異なるバージョンの同一アプリケーション内でデータを共有するために分離ストレージを使います。
少し前のid:kazzzさんの日記に、分離ストレージのApplication Scopeのことが書かれています。

IsolatedStorage for Application Scope - Kazzzの日記

簡単なアプリケーションを作成し、確認してみました。

Imports System.IO
Imports System.IO.IsolatedStorage
 
Public Class Form1
 
    Private isoStore As IsolatedStorageFile
 
    ' isoStoreTest.txtが分離ストレージにあればそれを読み込む
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        ' アプリケーションIDに対応するユーザースコープの分離ストレージを使用する
        isoStore = IsolatedStorageFile.GetUserStoreForApplication
        Dim fileNames As String() = isoStore.GetFileNames("isoStoreTest.txt")
        If fileNames.Length = 1 Then
            'isoStoreTest.txtをShift-JISエンコーディングで開く
            Dim sr As New System.IO.StreamReader(New IsolatedStorageFileStream("isoStoreTest.txt", FileMode.Open, isoStore), _
                System.Text.Encoding.GetEncoding(932))
            '内容をすべて読み込む
            TextBox1.Text = sr.ReadToEnd()
            '閉じる
            sr.Close()
        End If
 
    End Sub
 
    ' 分離ストレージにisoStoreTest.txtを書き込む
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        ' ファイルを上書きし、Shift JISエンコーディングで書き込む
        Dim sw As New StreamWriter(New IsolatedStorageFileStream("isoStoreTest.txt", FileMode.Create, isoStore), _
            System.Text.Encoding.GetEncoding(932))
        ' TextBox1.Textの内容をすべて書き込む
        sw.Write(TextBox1.Text)
        ' 閉じる
        sw.Close()
 
    End Sub
 
End Class
ボタンを押すとテキストボックスに入力されている文字列をテキストファイルとして保存し、アプリケーションの起動時にそのテキストファイルを読み込んでテキストボックスに表示するという単純なものです。これを下記のような順序で確認します。

  1. ClickOnceで発行してクライアントにインストール。
  2. アプリケーションが起動するので、テキストボックスに何らかのボタンを押してテキストファイルを保存し、アプリケーションを終了。
  3. スタートメニューからアプリケーションをもう一度起動すると、テキストボックスに先ほど保存した文字列が表示されていることを確認。
  4. 新しいバージョン、もしくはリビジョンを発行。
  5. クライアントでアプリケーションを起動すると新しいバージョンが利用可能であると表示されるので、これをインストール。
  6. 新しいバージョンのアプリケーションが起動するが、先ほどまでと同様保存していた文字列が表示されることを確認。