クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
.NET 開発
以前のバージョン
.NET Framework SDK 2.0
Windows Presentation Foundation
アプリケーション開発
アプリケーション管理
 WPF におけるパッケージの URI

  低帯域幅での表示をオンにする
このページは次のバージョンについて記述しています。
Microsoft Visual Studio 2005/.NET Framework 2.0

その他のバージョンについては、以下の情報を参照してください。
Windows Presentation Foundation におけるパッケージの URI

アプリケーション データ ファイル (「Windows Presentation Foundation のアプリケーション データ ファイル」を参照) を識別するために、WPF は、パッケージの URI スキームと呼ばれる、広く知られている拡張可能な統一リソース識別子 (URI) ベースの機構を利用します。パッケージの URI スキームが持つ拡張性により、WPF は、さまざまな場所に存在している可能性がある複数の種類のアプリケーション データ ファイルを、一貫性のある 1 種類の方法で識別することができます。

このトピックには次のセクションが含まれています。

パッケージの URI スキーム

Open Packaging Conventions (OPC) 仕様には、コンテンツを編成、識別するためのモデルが記載されています。このモデルの中核となるのは、パッケージとパーツの 2 つの論理エンティティです。パッケージは、次の図に示すように、1 つ以上のコンテンツ パーツを格納するコンテナです

Package and Parts diagram

これらのパーツを識別できるようにするために、OPC は RFC 2396 の拡張機能を利用して、パッケージの URI スキームを定義します。URI で指定されるスキームは、そのプレフィックスで定義されます。httpftpfile などのプレフィックスがよく知られています。パッケージの URI スキームは、pack をそのスキームとして使用し、証明機関とパスの 2 つのコンポーネントを含みます。authority は、パーツが格納されているパッケージの種類を指定し、path は、パッケージ内のパーツの場所を指定します。この概念を次の図に示します。

パッケージの URI スキームに準拠する URI は、"パッケージの URI" と呼ばれ、次の形式を使用します。

pack://<authority><path>

パッケージとパーツという概念は、アプリケーションとアプリケーション データ ファイルに似ています。つまり、アプリケーション (パッケージ) には、次のような 1 つ以上のアプリケーション データ ファイル (パーツ) を含めることができます。

  • ローカル アセンブリにコンパイルされるリソース ファイル。

  • 参照アセンブリにコンパイルされるリソース ファイル。

  • 参照元のアセンブリにコンパイルされるリソース ファイル。

  • コンテンツ ファイル。

  • 起点サイト ファイル。

これら 4 種類のアプリケーション データ ファイルにアクセスするために、WPF は、application:/// と siteoforigin:/// という 2 つの証明機関をサポートします。application:/// 証明機関は、リソース ファイルとコンテンツ ファイルの両方を含む、コンパイル時に認識されるアプリケーション データ ファイルを識別するために使用されます。siteoforigin:/// 証明機関は、起点サイト ファイルを識別するために使用されます。

メモメモ :

パッケージの URI の証明機関コンポーネントは、パッケージを指す埋め込みの URI で、RFC 2396 に準拠する必要があります。また、"/" 文字は "," 文字に置き換え、"%" や "?" などの予約された文字はエスケープする必要があります。詳細については、OPC を参照してください。

各証明機関のスコープを、次の図に示します。

Pack URI diagram

以下のトピックでは、2 つの証明機関をパスと組み合わせて使用してパッケージの URI を構築し、リソース ファイル、コンテンツ ファイル、および起点サイト ファイルを識別する方法について説明します。

リソース ファイルのパッケージ URI - ローカル アセンブリ

ローカル アセンブリにコンパイルされるリソース ファイルのパッケージ URI は、次の証明機関とパスを使用します。

  • 証明機関 : application:///

  • パス : ローカル アセンブリ プロジェクト フォルダのルートに対して相対的なパスを含む、リソース ファイルの名前

ローカル アセンブリのプロジェクト フォルダのルートにある XAML リソース ファイルのパッケージ URI の例を次に示します。

pack://application:,,,/ResourceFile.xaml

ローカル アセンブリのプロジェクト フォルダのサブフォルダにある XAML リソース ファイルのパッケージ URI の例を次に示します。

pack://application:,,,/Subfolder/ResourceFile.xaml

リソース ファイルのパッケージ URI - 参照アセンブリ

参照アセンブリにコンパイルされるリソース ファイルのパッケージ URI は、次の証明機関とパスを使用します。

  • 証明機関 : application:///

  • パス : 参照アセンブリにコンパイルされるリソース ファイルのパスは、次の形式に準拠します

    AssemblyShortName[;Version][;PublicKey];component/Path

    • AssemblyShortName は、参照アセンブリの短い名前です。

    • ;Version (省略可能) は、リソース ファイルを含む参照アセンブリのバージョンを表します。これは、同じ短い名前を持つ 2 つ以上の参照アセンブリを読み込む場合に使用されます。

    • ;PublicKey (省略可能) は、参照アセンブリに署名するために使用された公開キーを表します。これは、同じ短い名前を持つ 2 つ以上の参照アセンブリを読み込む場合に使用されます。

    • ;component は、参照アセンブリがローカル アセンブリから参照されることを指定します。

    • /Path は、参照アセンブリのプロジェクト フォルダのルートに対して相対的なパスを含む、リソース ファイルの名前です。

参照アセンブリのプロジェクト フォルダのルートにある XAML リソース ファイルのパッケージ URI の例を次に示します。

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml

参照アセンブリのプロジェクト フォルダのサブフォルダにある XAML リソース ファイルのパッケージ URI の例を次に示します。

pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

バージョン固有の参照アセンブリのプロジェクト フォルダのルート フォルダにある XAML リソース ファイルのパッケージ URI の例を次に示します。

pack://application:,,,/ReferencedAssembly;v1.0.0.1;component/ResourceFile.xaml

コンテンツ ファイルのパッケージ URI

コンテンツ ファイルのパッケージ URI は、次の証明機関とパスを使用します。

  • 証明機関 : application:///

  • パス : アプリケーションのメインの実行可能アセンブリのファイル システムの場所に対して相対的なパスを含む、コンテンツ ファイルの名前

実行可能アセンブリと同じフォルダにある XAML コンテンツ ファイルのパッケージ URI の例を次に示します。

pack://application:,,,/ContentFile.xaml

アプリケーションのメインの実行可能アセンブリのファイル システムの場所に対して相対的なサブフォルダにある XAML コンテンツ ファイルのパッケージ URI の例を次に示します。

pack://application:,,,/Subfolder/ContentFile.xaml

起点サイト ファイルのパッケージ URI

起点サイト ファイルのパッケージ URI は、次の証明機関とパスを使用します。

  • 証明機関 : siteoforigin:///

  • パス : 実行可能アセンブリが起動される場所に対して相対的なパスを含む、起点サイト ファイルの名前

実行可能アセンブリが起動される場所に格納されている、XAML 起点サイト ファイルのパッケージ URI の例を次に示します。

pack://siteoforigin:,,,/SiteOfOriginFile.xaml

実行可能アセンブリが起動される場所のサブフォルダに格納されている、XAML 起点サイト ファイルのパッケージ URI の例を次に示します。

pack://siteoforigin:,,,/Subfolder/SiteOfOriginFile.xaml

絶対パッケージ URI と相対パッケージ URI

完全修飾パッケージ URI には、スキーム、証明機関、パスが含まれ、絶対パッケージ URI と見なされます。開発者にとっての簡便さを考慮して、通常、XAML 要素では、パスだけを含む相対パッケージ URI で適切な属性を設定できます。

たとえば、ローカル アセンブリ内のリソース ファイルに対する次の絶対パッケージ URI を考えてみます。

pack://application:,,,/ResourceFile.xaml

このリソース ファイルを参照する相対パッケージ URI は、次のようになります。

/ResourceFile.xaml

メモメモ :

起点サイト ファイルにアセンブリとの関連付けがないため、パッケージ URI を使用した参照だけが可能です。

既定では、相対パッケージ URI 参照は、参照を含むマークアップ ファイルまたはコード ファイルに対して相対的であると見なされます。ただし、先頭にバックスラッシュを使用すると、相対パッケージ URI 参照はアプリケーションのルートに対して相対的であると見なされます。たとえば、次のプロジェクト構造を考えます。

App.xaml

Page2.xaml

\SubPages

Page1.xaml

Page2.xaml

Page1.xaml で、SubPages フォルダ内にある Page2.xaml ファイルに対する相対パッケージ URI を作成する場合は、以下を使用できます。

Page2.xaml

ただし、Page1.xaml で、ルート フォルダ内にある Page2.xaml ファイルに対する相対パッケージ URI を作成する場合は、以下を使用できます。

Page1.xaml

パッケージ URI の解決

パッケージ URI の形式は、パッケージ URI がローカルのリソース ファイルとコンテンツ ファイルの両方で同じに見えるようになっています。

pack://application:,,,/ResourceOrContentFile.xaml

これは、相対 URI にも当てはまります。

/ResourceOrContentFile.xaml

この類似性があるため、WPF では、このようなパッケージ URI がリソース ファイルとコンテンツ ファイルのどちらを参照しているかを判断する手段が必要です。パッケージ URI にはこの種の情報が含まれていないため、WPF は、次のヒューリスティックを使用して URI を解決します。

  1. アセンブリ メタデータに、パッケージ URI に一致する AssemblyAssociatedContentFileAttribute があるかどうかを調べます。

  2. AssemblyAssociatedContentFileAttribute 属性が見つかった場合は、パッケージ URI のパスはコンテンツ ファイルを参照しています。

  3. AssemblyAssociatedContentFileAttribute 属性が見つからない場合、列挙されているローカル アセンブリにコンパイルされた設定リソース ファイルを調べます。

  4. パッケージ URI のパスに一致するリソース ファイルが見つかると、パッケージ URI のパスはリソース ファイルを参照しています。

  5. リソースが見つからない場合、内部で作成された Uri は無効です。

メモメモ :

リソース解決には絶対パッケージ URI と相対パッケージ URI だけが含まれます。参照アセンブリ内のコンテンツ ファイルは、WPF でサポートされないため、含まれません。参照アセンブリに埋め込まれたファイルのパッケージ URI は一意です。これらのパッケージ URI には、参照アセンブリの名前と ;component サフィックスの両方が含まれるためです。起点サイト ファイルのパッケージ URI は一意です。これらのパッケージ URI は、siteoforigin:/// 証明機関を使用する唯一のパッケージ URI であるためです。

WPF リソース解決を使用すると、アプリケーション データ ファイルの場所に依存しないパッケージ URI を作成できます。そのため、たとえば、実行可能ではないデータ ファイルの種類を Resource から Content にビルドする場合、パッケージ URI は変更する必要がありません。

パッケージ URI を使用したプログラミング

パッケージ URI を必要とするプロパティは、多くの WPF クラスが実装します。これらのプロパティには、System.Windows.Application.StartupUriSystem.Windows.Controls.Frame.SourceSystem.Windows.Navigation.NavigationWindow.SourceSystem.Windows.Documents.Hyperlink.NavigateUriSystem.Windows.Window.IconSystem.Windows.Controls.Image.Source などがあります。

これらのプロパティは、マークアップとコードのどちらからも設定できます。

マークアップでのパッケージ URI の使用

マークアップでは、パッケージ URI の文字列値を使用して属性の要素を設定することで、パッケージ URI を指定します。たとえば、次のようになります。

<element attribute="pack://application:,,,/File.xaml" />

マークアップで文字列値を使用して指定できるさまざまな絶対パッケージ URI と相対パッケージ URI を次の表に示します。

表 1 : マークアップでの絶対パッケージ URI と相対パッケージ URI

実行不可能なデータ ファイル 絶対パック URI

リソース ファイル - ローカル アセンブリ

[絶対サイズ]

"pack://application:,,,/File.xaml"

サブフォルダ内のリソース ファイル - ローカル アセンブリ

[絶対サイズ]

"pack://application:,,,/Subfolder/File.xaml"

リソース ファイル - 参照アセンブリ

[絶対サイズ]

"pack://application:,,,/ReferencedAssembly;component/File.xaml"

サブフォルダ内のリソース ファイル - 参照アセンブリ

[絶対サイズ]

"pack://application:,,,/ReferencedAssembly;component/Subfolder/File.xaml"

リソース ファイル - バージョン管理された参照アセンブリ

[絶対サイズ]

"pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/File.xaml"

コンテンツ ファイル

[絶対サイズ]

"pack://application:,,,/File.xaml"

サブフォルダ内のコンテンツ ファイル

[絶対サイズ]

"pack://application:,,,/Subfolder/File.xaml"

Site of Origin ファイル

[絶対サイズ]

"pack://siteoforigin:,,,/File.xaml"

サブフォルダ内の Site of Origin ファイル

[絶対サイズ]

"pack://siteoforigin:,,,/Subfolder/File.xaml"

リソース ファイル - ローカル アセンブリ

[相対]

"/File.xaml"

サブフォルダ内のリソース ファイル - ローカル アセンブリ

[相対]

"/Subfolder/File.xaml"

リソース ファイル - 参照アセンブリ

[相対]

"/ReferencedAssembly;component/File.xaml"

サブフォルダ内のリソース ファイル - 参照アセンブリ

[相対]

"/ReferencedAssembly;component/Subfolder/File.xaml"

コンテンツ ファイル

[相対]

"/File.xaml"

サブフォルダ内のコンテンツ ファイル

[相対]

"/Subfolder/File.xaml"

メモメモ :

Site of Origin ファイルは、絶対パック URI でのみ参照できます。

コードでのパッケージ URI の使用

コードでは、Uri クラスをインスタンス化し、パラメータとしてパッケージ URI をコンストラクタに渡すことでパッケージ URI を指定します。このコード例を次に示します。

C#
Uri uri = new Uri("pack://application:,,,/File.xaml");

既定では、Uri クラスは、URI 参照を絶対と見なします。そのため、相対パッケージ URI を参照する Uri クラスのインスタンスを使用しようとすると、例外が発生します。

C#
Uri uri = new Uri("/File.xaml");

しかし、Uri クラスのコンストラクタの 1 つのオーバーロードは、UriKind 型のパラメータを受け取ります。この型のパラメータを使用すると、URI が絶対または相対のどちらであるかを指定できます。

C#
// Absolute URI (default)
Uri absoluteUri = new Uri("pack://application:,,,/File.xaml", UriKind.Absolute);
// Relative URI
Uri relativeUri = new Uri("/File.xaml", <b>UriKind.Relative</b>);

提供されたパッケージ URI が AbsoluteRelative のどちらであるかわかっている場合は、それだけを指定します。ただし、コンパイル時にパッケージ URI が絶対か相対かわからない場合があります。たとえば、アプリケーションが実行時にユーザー指定のパッケージ URI (絶対か相対のいずれか) を受け取る場合があります。この場合は、代わりに RelativeOrAbsolute を使用します。

C#
// Relative or Absolute URI
TextBox userProvidedUriTextBox = new TextBox();
Uri uri = new Uri(userProvidedUriTextBox.Text, UriKind.RelativeOrAbsolute);

コードで T:System.Uri を使用して指定できるさまざまな絶対パッケージ URI と相対パッケージ URI を次の表に示します。

表 2 : コードでの絶対パッケージ URI と相対パッケージ URI

実行不可能なデータ ファイル 絶対パック URI

リソース ファイル - ローカル アセンブリ

[絶対サイズ]

Uri uri = new Uri("pack://application:,,,/File.xaml", UriKind.Absolute");

サブフォルダ内のリソース ファイル - ローカル アセンブリ

[絶対サイズ]

Uri uri = new Uri("pack://application:,,,/Subfolder/File.xaml", UriKind.Absolute");

リソース ファイル - 参照アセンブリ

[絶対サイズ]

Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/File.xaml", UriKind.Absolute");

サブフォルダ内のリソース ファイル - 参照アセンブリ

[絶対サイズ]

Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/Subfolder/File.xaml", UriKind.Absolute");

リソース ファイル - バージョン管理された参照アセンブリ

[絶対サイズ]

Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/File.xaml", UriKind.Absolute");

コンテンツ ファイル

[絶対サイズ]

Uri uri = new Uri("pack://application:,,,/File.xaml", UriKind.Absolute");

サブフォルダ内のコンテンツ ファイル

[絶対サイズ]

Uri uri = new Uri("pack://application:,,,/Subfolder/File.xaml", UriKind.Absolute");

Site of Origin ファイル

[絶対サイズ]

Uri uri = new Uri("pack://siteoforigin:,,,/File.xaml", UriKind.Absolute");

サブフォルダ内の Site of Origin ファイル

[絶対サイズ]

Uri uri = new Uri("pack://siteoforigin:,,,/Subfolder/File.xaml", UriKind.Absolute");

リソース ファイル - ローカル アセンブリ

[相対]

Uri uri = new Uri("/File.xaml", UriKind.Relative");

サブフォルダ内のリソース ファイル - ローカル アセンブリ

[相対]

Uri uri = new Uri("/Subfolder/File.xaml", UriKind.Relative");

リソース ファイル - 参照アセンブリ

[相対]

Uri uri = new Uri("/ReferencedAssembly;component/File.xaml", UriKind.Relative");

サブフォルダ内のリソース ファイル - 参照アセンブリ

[相対]

Uri uri = new Uri("/ReferencedAssembly;component/Subfolder/File.xaml", UriKind.Relative");

コンテンツ ファイル

[相対]

Uri uri = new Uri("/File.xaml", UriKind.Relative");

サブフォルダ内のコンテンツ ファイル

[相対]

Uri uri = new Uri("/Subfolder/File.xaml", UriKind.Relative");

メモメモ :

Site of Origin ファイルは、絶対パック URI でのみ参照できます。

参照

コミュニティ コンテンツ   コミュニティ コンテンツとは
新しいコンテンツの追加 RSS  注釈
Processing
© 2009 Microsoft Corporation. All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker