.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 、 WindowState が Minimized の状態で、WindowStyle に None 以外を設定しようとすると、 InvalidOperationException が throw される。
既存アプリケーションでの対応
AllowsTransparency が true の状態で WindowStyle を変更する必要がある場合は、 Win32 API の SetWindowLongPtr 関数を使用可能である。
XPS ビューア
WPF には Microsoft XML Paper Specification Essentials Pack (XPSEP) が含まれない。
XPSEP は Windows 7 と Windows 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 関連ツールはインストールされない、ってことですかね。