« [.NET] private な拡張メソッドでメソッド チェーン | トップページ | [.NET] マイクロソフトのサンプル コード集が充実しつつある »

2010年1月21日 (木)

[.NET] WPF は ILMerge できない (続)

正確には、 画面の XAML 定義が入っている複数のアセンブリを ILMerge でマージすると実行時エラーになる、 です。

Microsoft Connect: FeedbackID=525042
WPFのプログラムをILMergeでまとめると、実行時にエラーになります
2010/01/14

この現象は私も経験していて、 まぁそういう仕様なんだと理解しています。 画面だけ 1プロジェクトに集めてしまえばいいわけで、 ASP.NET と同じようなもんだと。
今回、 気になってもう少し探してみたところ、 どうやら XAML をコンパイルして出来上がる BAML ファイルのフォーマットが非公開なので、 ILMerge が (に限らず、 他のマージツールも) 対応できない、 ということみたいです。

Microsoft の XAML/WPF Team でアーキテクトをしている Rob Relyea 氏が、 いくつか回答しています。

.NET Development Forums: Code Protection and Licensing of WPF Applications.

August 16, 2007
The major problem today with Obfuscators and WPF application is BAML.  The markup compiler encodes type references in .baml and those baml files get embedded inside of the assembly.

Windows Live: Obfuscation and Xaml/Baml
2007/8/16

Unfortunately, we don't have the baml format published (as we think we will need to change it) and don't have an adequate API to help obfuscators.

ここでは Obfuscation (難読化) について言っていますが、 フォーマットが分からないのではマージすることもまた出来ません。

ちなみに、 XAML を使わずに、 コードだけで画面を実装すればマージできるはずですが、 そんな苦労をするよりも素直に 1プロジェクトに画面を集めたほうが楽でしょう。 そうすると、 UI とロジックは分離することになるし。


(2010/1/28 追記)
予想通り、 "by design" という回答が付いていました。

WPF compiles XAML into BAML during compilation. The BAML has explicit references to types and assemblies. Combining multiple dll/exes into one breaks since the BAML is not updated.

Unfortunately, fixing this will likely require a change to BAML, we cannot make this change at this time.

WPF は、コンパイル中に XAML を BAML にコンパイルします。 BAML は、タイプやアセンブリを明示的に参照します。 複数の DLL や EXE を1つにまとめると、BAML が更新されないため、破損してしまいます。

残念ながら、こちらを修正するには BAML を変更しなければならない可能性が高いため、私たちは、現時点でこの変更を実現することはできません。

やはり、 BAML を触らなきゃマージできないのがネックになっているようです。

|

« [.NET] private な拡張メソッドでメソッド チェーン | トップページ | [.NET] マイクロソフトのサンプル コード集が充実しつつある »

* プログラミング ( WPF )」カテゴリの記事

プログラミング」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/209349/47349724

この記事へのトラックバック一覧です: [.NET] WPF は ILMerge できない (続):

« [.NET] private な拡張メソッドでメソッド チェーン | トップページ | [.NET] マイクロソフトのサンプル コード集が充実しつつある »