雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

.NET Framework 3.5 から .NET Framework 4 への移行

すごい量があって読みきれない。。。
とりあえず、 WPF の分だけまとめてみます。
# 間違い、誤訳等あったら指摘をお願いします。全然自信ないので。。。><

例外のハンドリング

WPF4 では、 NullReferenceException, OutOfMemoryException, StackOverflowException, SecurityException などの致命的な例外が発生した場合に、これらの例外を InnerException プロパティにセットした TargetInvocationException を throw する。
これにより、上位のプログラムでは致命的な例外を個別に catch する必要がなくなる。*1

リソースのリンク

アプリケーションがビルドされる際、リンクを容易にするために、プロジェクトフォルダ構造の外に配置されているイメージなどのリソースファイルのリソース ID として、そのファイルのフルパスではなくファイル名を使用する。
ファイルの検索は実行時に行われる。

部分的信頼アプリケーション

セキュリティを考慮し、 WebBrowser コントロール、若しくは HTML を含む Frame コントロールを使用して、部分的信頼で稼動する Windows ベースのアプリケーションは、該当のコントロールを生成する際に SecurityException を throw する。
ブラウザアプリケーションは、以下の条件を満たす際に例外を throw してメッセージを表示する:

  • Firefox 上でアプリケーションが実行された場合
  • 部分的信頼で動作するアプリケーションが、信頼されていないインターネットゾーンのサイトで実行された場合
  • WebBrowser コントロール、若しくは HTML を含む Frame コントロールを使用するアプリケーションの場合

但し、信頼されたサイト、若しくはイントラネットゾーンのサイトでアプリケーションが実行された場合は影響されない。

既存アプリケーションでの対応
  • 完全信頼で動作する様にする
  • アプリケーションの利用者側でアプリケーションが動作するサイトを信頼サイトに追加する
  • Internet Explorer を使用してアプリケーションを実行する

リソースディクショナリ

テーマ単位のリソースディクショナリの利用効率を向上させ、意図しない変更を防ぐため、リソースディクショナリとして定義され、テーマ単位にマージされた凍結可能な (Freezable) リソースは、常に Freeze され不変な状態となる。
これは凍結可能なリソースとして正常な動作である。

既存アプリケーションでの対応

テーマ単位にマージされたリソースディクショナリをアプリケーションで修正する際は、リソースのクローンを生成して、そのクローンに対して修正を行う。
若しくは、リソースに x:Shared="false" を付与することで、リソースを必要とする際に毎回 ResourceDictionary のコピーが生成される様になる。

Windows 7

Windows 7 上でより快適に WPF アプリケーションを実行するため、ウィンドウの動作について以下の点を修正した:

  • Dock とジェスチャーの状態は、ユーザとの対話に基づいて適切に動作する様にした
  • ウィンドウのカスケード、スタック表示、サイド by サイドによる表示といったタスクバーのコマンドが正しく動作し、また適切にプロパティをアップデート出来る様にした
  • 最大化、最小化されたウィンドウについて、 Top, Left, Width, Height の各プロパティは、モニタの設定に応じて適切な値で復元される様になった

ウィンドウのスタイルと透過

AllowsTransparency が true 、 WindowStateMinimized の状態で、WindowStyleNone 以外を設定しようとすると、 InvalidOperationException が throw される。

既存アプリケーションでの対応

AllowsTransparency が true の状態で WindowStyle を変更する必要がある場合は、 Win32 API の SetWindowLongPtr 関数を使用可能である。

XPS ビューア

WPF には Microsoft XML Paper Specification Essentials Pack (XPSEP) が含まれない。
XPSEP は Windows 7Windows Vista に含まれる。*2
そのため、 .NET Framework 3.5 SP1 がインストールされていない Windows XP 端末上で、 PrintDialog 以外から WPF API を利用して印刷を実行する場合、 WINSPOOL に依存する。
この際、プリンタの機能の一部が使用不能であったり、プリンタ設定の一部が印刷時に反映されない事がある。

既存アプリケーションでの対応

必要であれば、 Microsoft XML Paper Specification Essentials Pack をインストールする。

*1:TargetInvocationException のみを catch すればよいってことでしょうか?

*2:つまり、 .NET Framework 3.5 未インストールの Windows XP 端末に .NET Framework 4 をインストールしても、 XPS Document Viewer 等の XPS 関連ツールはインストールされない、ってことですかね。