しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

.NET 4 の罠に引っかかった

みについを .NET Framework 4 に対応させたバージョンを昨日、半自動更新でのアップデートを開始したのですが、今朝にテーマが読み込めなくて落ちるという報告を頂きました。

帰宅後すぐに調査し始めたのですが 2 つの罠に引っかかったことがわかりました。

部分信頼アセンブリは(そのままでは)読み込めない

CASが廃止。.NET 4のセキュリティはどうなるのか? − @IT

.NET Framework 4 では CAS がデフォルトで無効になっています。その代わりに透過的セキュリティ コードが導入されました。それによって、今まではインターネットサンドボックスで実行されていたアセンブリを読み込もうとすると例外が発生するようになりました。

そういったアセンブリを読み込む必要があるときはサンドボックスを明示的に作れということらしいですが、HTTP 経由で直接読み込むとか普通やらないと思ってませんか?実は NTFS 代替データストリームに Zone.Identifier が付加されているファイルも部分信頼になっていて、読み込もうとすると例外が発生します。

Zone.Identifier は XP SP2 から導入された、インターネットからダウンロードしたファイルを実行しようとすると警告を出すやつです。代替ストリームを使って Zone.Identifier を付けてインターネットからダウンロードしたという印をつけているのですが、Windows 標準の ZIP 展開機能を使うと中身のファイルにも Zone.Identifier が残っているので、ZIP などで配布しているアプリケーションは影響を受けてしまいます。

<loadFromRemoteSources> 要素

ここで使うのがこの loadFromRemoteSources 要素です。構成ファイルに

<loadFromRemoteSources enabled="true" />

と追加しておけば、HTTP 経由などで取得したアセンブリでも完全信頼で読み込んでくれます。盲目的に追加しておくのは駄目だと思いますが、知らないと私のように頭を抱える羽目になります。

COM 相互運用アセンブリが x86 固定

Visual Studio 2008 は COM 参照追加した時に生成されるアセンブリは ILONLY フラグだけが付いているので x86 でも x64 でも利用することが出来るんですが、2010 では ILONLY と 32BITREQUIRED フラグが付くようになっていました。よってターゲットプラットフォームを Any CPU にしていると問題が発生します。

何処か弄れば Any CPU に出来るのかと思ったのですがよくわかりませんでした。仕方なくみについは 1.5 からターゲットプラットフォームが x86 に変更しました。