Neutral Scent

App developments & Gadgets

BCL AsyncやHttpClientを利用したWPFプロジェクトをClickOnce化するときのおまじない(たぶん今だけ)

あるWPFアプリをClickOnce化しようとしたところ、発行先で全く起動しなかったのです。
まぁ、いくつか心当たりもあったので色々と追いかけていたのですが、なんかどうもそれ以前の場所で落ちている。ていうか、asyncのメソッドの中が全く呼ばれない!?
というわけで、調べてみると一発でした。

Async Targeting Pack KB - MSDN Blogs
http://blogs.msdn.com/b/bclteam/p/asynctargetingpackkb.aspx

トラブルシューティング

      • -

Issue 9
問題点
.NET Framework 4.0をターゲットとしたアプリケーションがMicrosoft.Bcl 又は Microsoft.Bcl.Asyncを参照している場合、TypeLoadExceptionもしくは他のエラーがインストール後に発生する。
解決策
この現象は、ClickOnceが必要となるアセンブリのデプロイに失敗することにより発生する。ワークアラウンド(回避策)として以下の手順を実行する。
1. (ソリューションエクスプローラーの)プロジェクトを右クリックし、「追加/既存の項目」を選択
2. (nuget等で追加した)packagesフォルダ配下のMicrosoft.Bcl.*フォルダ下のnet40フォルダを選択
3. ファイルの種類で「すべてのファイル (*.*)」を選択
4. 一覧から、Ctrlを押下しながら、System.Runtime.dll と System.Threading.Tasks.dllを複数選択
5. [追加]ボタンの右側の▼を押下、「リンクとして追加」を選択
6. ソリューションエクスプローラーを開き追加されたSystem.Runtime.dll と System.Threading.Tasks.dllをCtrlを押しながら複数選択
7. 右クリックして「プロパティ」を選択しプロパティウインドウを開き「出力ディレクトリにコピー」を「常にコピー」へ変更
8. 改めてプロジェクトの「発行」を行う

という、手順です。
見ての通り、packagesのdllを直接リンク登録しているので、nugetでモジュールが更新された場合は再度変更する必要があるのが要注意ですね。

さらに、動いたー! と試していたところ、今度はデータの取得が行われません。こちらも、debugしてみたところ、

ファイルまたはアセンブリ 'System.Net.Http, ...'、またはその依存関係の 1 つが読み込めませんでした。

というわけで、HttpClientよ、お前もか、というわけです。
同様の手順で、Microsoft.Net.Http下のSystem.Net.Http.dllを追加することで解決しました。同ディレクトリにはSystem.Net.Http.Extensions.dllやSystem.Net.Http.Primitives.dll、System.Net.Http.WebRequest.dllなどもありますが、HttpClientに関してはSystem.Net.Http.dll単体で十分なようです。というか余計に追加するとインストールエラーとなります。

とりあえず、現状のClickOnceの問題でもしかするとすでにVS2013辺りでは起きないかもしれませんが、こんなこともあったよ、ということで。