Share via


ClickOnce アプリケーションにおけるローカル データおよびリモート データへのアクセス

ほとんどのアプリケーションはデータを使用または作成します。 ClickOnce には、データをローカルとリモートの両方で読み書きするための各種のオプションがあります。

ローカル データ

ClickOnce では、次のいずれかの方法を使用してデータを読み込んでローカルに格納できます。

  • ClickOnce データ ディレクトリ

  • 分離ストレージ

  • その他のローカル ファイル

ClickOnce データ ディレクトリ

ローカル コンピューターにインストールされている各 ClickOnce アプリケーションには、ユーザーの "Documents and Settings" フォルダーに格納されているデータ ディレクトリがあります。 ClickOnce アプリケーションに含まれていて、"データ" ファイルとしてマークされているすべてのファイルは、アプリケーションのインストール時にこのディレクトリにコピーされます。 どのような種類のファイルでもデータ ファイルとして指定できます。最もよく使用されるのは、テキスト ファイルや XML ファイル、データベース ファイル (Microsoft Access の .mdb ファイルなど) です。

データ ディレクトリは、アプリケーションで管理するデータ、つまり、アプリケーションによって明示的に格納および保守されるデータ用のディレクトリです。 アプリケーション マニフェストで "データ" のマークが付けられていない静的で非依存のすべてのファイルは、アプリケーション ディレクトリに格納されます。 このディレクトリには、アプリケーションの実行可能ファイル (.exe) とアセンブリがあります。

Note

ClickOnce アプリケーションをアンインストールすると、そのデータ ディレクトリも削除されます。 文書ファイルなど、エンド ユーザーが管理するデータを格納するためには、データ ディレクトリを使用しないでください。

ClickOnce で配布するデータ ファイルのマーク付け

既存のファイルをデータ ディレクトリに格納するには、そのファイルを ClickOnce アプリケーションのアプリケーション マニフェスト ファイル内でデータ ファイルとしてマークする必要があります。 詳しくは、「方法: ClickOnce アプリケーションにデータ ファイルを含める」をご覧ください。

データ ディレクトリに対する読み取りと書き込み

データ ディレクトリからデータを読み込むには、ClickOnce アプリケーションで読み取りアクセス許可を要求することが必要です。同じように、このディレクトリに書き込むには、書き込みアクセス許可が必要です。 完全な信頼を得て実行するようにアプリケーションが構成されている場合、これらのアクセス許可は自動的にアプリケーションに与えられます。 アクセス許可の昇格機能または信頼されたアプリケーションの配置を使用してアプリケーションのアクセス許可を昇格する方法の詳細については、「ClickOnce アプリケーションのセキュリティ保護」を参照してください。

Note

組織が信頼されたアプリケーションの配置を使用しておらず、アクセス許可の昇格機能をオフにしている場合は、アクセス許可のアサートは失敗します。

アプリケーションにこれらのアクセス許可が与えられると、アプリケーションは System.IOに属する各クラスのメソッド呼び出しを使用して、データ ディレクトリにアクセスできます。 Windows フォーム ClickOnce アプリケーション内のデータ ディレクトリのパスを取得するには、ApplicationDeploymentCurrentDeployment プロパティに定義された DataDirectory プロパティを使用します。 これは、データにアクセスする最も便利な方法として推奨されています。 次のコード例では、ご利用の配置にデータ ファイルとして組み込んだ CSV.txt というテキスト ファイルに対してこの操作を実行する方法を示します。

Note

NET Core および .NET 5 以降のバージョンでは、System.Deployment.Application 名前空間内の ApplicationDeployment クラスと API はサポートされていません。 .NET 7 では、アプリケーションの配置プロパティにアクセスするための新しいメソッドがサポートされています。 詳細については、.NET の ClickOnce 配置プロパティへのアクセスに関するページを参照してください。 .NET 7 では、ApplicationDeployment メソッドと同等のメソッドはサポートされていません。

if (ApplicationDeployment.IsNetworkDeployed)
{
    try
    {
        using (StreamReader sr = new StreamReader(ApplicationDeployment.CurrentDeployment.DataDirectory + @"\CSV.txt"))
        {
            MessageBox.Show(sr.ReadToEnd());
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Could not read file. Error message: " + ex.Message);
    }
}

配置内のファイルをデータ ファイルとしてマークする方法の詳細については、「 How to: Include a Data File in a ClickOnce Application」を参照してください。

Application クラスにある LocalUserAppDataPathなど、関連する変数を使用してデータ ディレクトリのパスを取得することもできます。

他の種類のファイルを扱うには、アクセス許可の追加が必要になる場合があります。 たとえば、Access データベース (.mdb) ファイルを使用するには、関連する <xref:System.Data> クラスを使用するために、アプリケーションから完全な信頼をアサートする必要があります。

データ ディレクトリとアプリケーションのバージョン

アプリケーションの各バージョンのデータはそれぞれ別のデータ ディレクトリに格納され、バージョンごとに分離されます。 ClickOnce では、配置にデータ ファイルが含まれていてもいなくても、アプリケーションが実行時にデータ ファイルを新規作成する場所として使用できるように、このデータ ディレクトリが作成されます。 アプリケーションの新しいバージョンをインストールすると、ClickOnce により、前のバージョンのデータ ディレクトリから新しいバージョンのデータ ディレクトリに、既存のデータ ファイルがすべてコピーされます。このとき、それらが元の配置に含まれていたものか、アプリケーションによって作成されたものかは区別されません。

データ ファイルのハッシュ値がアプリケーションの古いバージョンと新しいバージョンとで異なる場合、ClickOnce は、古いバージョンのファイルをサーバーにある新しいバージョンのファイルに置き換えます。 また、以前のバージョンのアプリケーションで作成された新しいファイルの名前が、新しいバージョンの配置に含まれているファイルと同じ名前の場合、ClickOnce は、古いバージョンのファイルを新しいファイルで上書きします。 どちらの場合にも、古いファイルはデータ ディレクトリの .preという名前のサブディレクトリに保存されるため、アプリケーションは移行時にそれらの古いデータにアクセスできます。

データをより細かく移行する必要がある場合は、ClickOnce Deployment API を使用して、古いデータ ディレクトリから新しいデータ ディレクトリへのカスタム移行を実行できます。 利用可能なダウンロードを IsFirstRunを使用してテストし、 Update または UpdateAsyncを使用して更新プログラムをダウンロードし、更新が完了した後に各自のカスタム データ移行タスクを実行する必要があります。

分離ストレージ

分離ストレージには、簡単な操作でファイルを作成したりアクセスしたりできる API が用意されています。 格納したファイルの実際の場所は、開発者からもユーザーからも隠されます。

分離ストレージは、.NET Framework のすべてのバージョンで動作します。 分離ストレージは、部分的に信頼されたアプリケーション内でも、アクセス許可を追加せずに動作します。 アプリケーションを部分的に信頼された状態で実行する必要がある場合に、アプリケーション固有のデータを保守する必要があるときは、分離ストレージを使用する必要があります。

詳細については、「 分離ストレージ」を参照してください。

その他のローカル ファイル

アプリケーションでレポート、画像、音楽などのエンド ユーザー データを処理し、保存する必要がある場合は、アプリケーションにおいて、 FileIOPermission によりローカル ファイル システムに対するデータの読み込みと書き込みを実行することが必要になります。

リモート データ

アプリケーションでは、実行時に、顧客データや市場情報などの情報をリモートの Web サイトから取得する必要が生じることがあります。 このセクションでは、リモート データを取得するための最も一般的な手法について説明します。

HTTP を使用したファイルへのアクセス

WebClient 名前空間にある HttpWebRequest クラスまたは System.Net クラスを使用すると、Web サーバー上のデータにアクセスできます。 このデータは、静的なファイルか、未加工のテキストまたは XML データを返す ASP.NET アプリケーションのいずれかです。 データが XML 形式の場合には、 XmlDocument クラスを使用してデータを取得すると、最も高速です。このクラスの Load メソッドには引数として URL を渡します。 例については、「XML ドキュメントの DOM への読み取り」を参照してください。

アプリケーションから HTTP 経由でリモート データにアクセスする場合は、セキュリティを考慮する必要があります。 既定では、ClickOnce アプリケーションによるネットワーク リソースへのアクセスは、アプリケーションが配置された方法に応じて制限される場合があります。 この制限は、悪意のあるプログラムが特権の必要なリモート データへのアクセスを取得したり、ユーザーのコンピューターを使用してネットワーク上の他のコンピューターを攻撃したりすることを防ぐ目的で適用されます。

次の表は、採用できる配置の方法と、それぞれの既定の Web アクセス許可の一覧です。

配置のタイプ 既定のネットワーク アクセス許可
Web インストール アプリケーションのインストール元の Web サーバーにのみアクセスできます。
ファイル共有インストール どの Web サーバーにもアクセスできません。
CD-ROM インストール 任意の Web サーバーにアクセスできます。

ClickOnce アプリケーションがセキュリティ上の制限のために Web サーバーにアクセスできない場合は、アプリケーションから対象の Web サイトに WebPermission をアサートする必要があります。 ClickOnce アプリケーションに与えるセキュリティ アクセス許可を高める方法の詳細については、「ClickOnce アプリケーションのセキュリティ保護」を参照してください。

XML Web サービス経由でのデータ アクセス

データを XML Web サービスとして公開する場合は、XML Web サービス プロキシを使用してデータにアクセスできます。 このプロキシは、どちらかの Visual Studio を使用して作成した .NET Framework クラスです。 顧客の検索、注文の発注など、XML Web サービスを使用して実行する操作は、このプロキシのメソッドとして公開されます。 このため、Web サービスは未加工のテキスト ファイルや XML ファイルより簡単に使用できます。

HTTP 経由で動作する XML Web サービスには、 WebClient および HttpWebRequest クラスと同じセキュリティ制限が課されます。

データベースへの直接アクセス

System.Data 名前空間にあるクラスを使用すると、SQL Server などネットワーク上のデータベース サーバーとの直接接続を確立できますが、セキュリティの問題を考慮する必要があります。 HTTP 要求とは異なり、部分信頼の場合、データベース接続要求は既定で常に禁止されています。ClickOnce アプリケーションを CD-ROM からインストールした場合にだけ、既定でそのようなアクセス許可を得ることができます。 これにより、アプリケーションには完全信頼が与えられます。 特定の SQL Server データベースへのアクセスを有効にするには、アプリケーションからデータベースに対して SqlClientPermission を要求する必要があります。SQL Server 以外のデータベースへのアクセスを有効にするには、 OleDbPermissionを要求する必要があります。

ほとんどの場合、データベースに直接アクセスする必要はありません。代わりに、ASP.NET で記述された Web サーバー アプリケーションまたは XML Web サービスを経由してアクセスします。 Web サーバーから ClickOnce アプリケーションを配置した場合は、この方法でデータベースにアクセスするのが、多くの場合に最良の方法です。 部分的に信頼されたサーバーに、アプリケーションのアクセス許可を昇格せずにアクセスできます。