Bootstrapper().Run() 実行時にFileNotFoundException

WPFでPrsimを習得しようと日々格闘中です。 ふとしたタイミングで、Bootstrapper().Run()実行時に "ファイルまたはアセンブリ 'System.Runtime, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、 またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。 ":"System.Runtime, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" なるエラーが表示されて進まなくなってしまいました。 シンプルなShellのみ起動するように修正してもダメ。NuGetですべてのライブラリを一旦アンインストールし、最小限のみとして前に正常に起動した状態に戻してもダメ。 どうやら、app.configとターゲットバージョンにより発生(自分のプロジェクトでは4.7.2)するらしい。 https://github.com/dotnet/standard/issues/567 Workaroundsにあるようにapp.configのdependentAssemblyタグをすべて削除し、ターゲットバージョンを一旦4.0にして再度4.7.2に戻したところエラーが消えて動作するようになった…

<span title='2018-10-09 00:00:00 +0900 +0900'>October 9, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

WPFのMVVMについて考える

最近、Windows FormをやめてWPFのプログラムを書き始めている。 WPFは正直必要となる知識レベルが高く難しいというイメージで手が付けにくかった。今もそうだが。 何が難しいかといえば、MVVMの考え方をどこまで徹底するかに尽きるのではないかと思う。 MVVMについてまだまだ分からないことも多いが、今の認識をまとめる。 MVVMは、ModelとViewの間にViewModelという層を挟み、ModelとViewの依存関係を疎にするモデル WPFの場合、ViewとViewModelの間でデータを複雑なコード不要でやりとりするBindingという機構があるので、うまく記述すればViewとViewModelの間も疎にできる そうすると、Model, ViewModelは変えずにViewだけ差し替えることも可能となる。 Windows Formの場合は、Viewの一部であるコードビハインドに処理もがっつり書いてしまうため、Viewだけ差し替えるということはできず結構な書き換えが必要となる。 Windows Formもそうだが、何も考えずに書くとどうしてもViewに処理を書いて肥大化しがち。そこで、ViewはViewModelの処理の呼び出しのみにする方が良いとされ、コードビハインドには極力コードを書かない方が良いとされる。 逆にViewModel側もViewに依存してしまうと別のViewに差し替えることができなくなるので、Viewに関するコードは書かない方が良いとされる。 MessageBoxのようなダイアログや、別のWindowを直接起動する処理すら良くないとされる。 じゃあどうするんだというと、Blendと言う部品や直接呼び出さずにInterface経由とすることで直接依存を避ける手段を取るべきとされる。これが初心者には超絶難解だと思う。 逆に、上記のようなViewを差し替える事態がそもそも考えなくて良いのであれば、今まで通りコードビハインドにコードを書いても問題はない。それでもWindows Formより洗練された部品が使えるのでメリットはある。 さしあたって、すぐに直面するのはViewModelからMessageBoxのような利用者への通知処理をどう行うか。行いたいのはMessageBoxを出すことではなく利用者にメッセージを伝えることと抽象化し、ShowMessageのようなメソッドをもつInterfaceを定義してこれを利用する形とする方法をとっている。以下のページが参考になった。 http://sourcechord.hatenablog.com/entry/2016/01/23/170753 このパターンは、コンストラクタに引き渡す処理に気をつければViewModelからのViewの呼び出しが簡単にできるため、よく使っています。

<span title='2018-10-01 00:00:00 +0900 +0900'>October 1, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

ClosedXMLでWindows7だけレイアウトが崩れる

アホな話です。 ClosedXMLで、一部コードでうっかり以下のようなコード書いてました。 using (IXLWorkbook targetBook = new XLWorkbook(filePath)) { using (IXLWorksheet targetSheet = targetBook.Worksheet(1)) { } targetBook.Save(); } usingの入れ子です。 普通、入れ子になるような階層があれば一番上位のクラスが下位のDispose呼んでくれるっと思いますよね〜。 でも、このときはusing句覚えたてで、とにかく使いたかったんです、using入れ子かっけ〜って思ってたんです… 症状としては、Windows 7の場合のみシートのフォーマットが崩れます。なぜかWindows 10は大丈夫。OSによって症状が違う理由は不明。 sourceを見ると、XLWorksheetのDisposeでrange情報をクリアしてるっぽいから、そこで情報が消えて、そのまま保存すればそりゃレイアウトは崩れるな〜と。 追記) どうも、最新の0.93.1で発生し、0.92.0では発生しなかったようだ。ライブラリのバージョンアップした途端に大量に問い合わせが…

<span title='2018-09-13 00:00:00 +0900 +0900'>September 13, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

Microsoft Report使用時のビルド時の警告

Visual Studio 2017にてMicrosoft Reportを使用するために、Nugetで[Microsoft Rdlc Report Designer for Visual Studio]をインストールすると、ビルド時に「同じ依存アセンブリの異なるバージョン間での競合が見つかりました。」と警告が表示される。実行自体は問題なくできる。 https://qiita.com/hahifu/items/8dba20cd06fb0c3a9fa7 を参考に出力の詳細レベルを上げて確認すると、ReportのアセンブリがSQLServer.Typesの12.0.0に依存している一方で、NugetでReportインストール時に一緒にインストールされるSQLServer.Typesは14.0.0であるためのようだ… 依存関係の解消方法が思い付かず、また動作には影響はないため以下のサイトを参考に https://docs.microsoft.com/ja-jp/dotnet/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection 自動バインド リダイレクトを有効化したところ、警告は出なくなった。

<span title='2018-07-30 01:00:00 +0900 +0900'>July 30, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

ClickOnceでハマる

C#で開発したクライアントアプリケーションをClickOnceで配布する際にハマった2点 Windows10へのインストール イントラのファイルサーバに置いてある証明書が設定されていないClickOnceをWindows 10で実行すると、「コンピューターにセキュリティ上の問題を発生させるため、管理者がこのアプリケーションをブロックしました。…」と表示され、[閉じる]ボタンしか表示されないために、インストールができない。 Windows 7では普通にインストールできる。 https://answers.microsoft.com/ja-jp/windows/forum/apps_windows_10-winapps-appscat_tools/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC/45f6621c-35ca-4395-bdd4-685705e9fae0 にあるレジストリの[LocaIntranet]の値をEnabledにする必要があった。 設定変更は直ちに反映される(OS再起動は不要) 関連アセンブリの添付 上記をクリアしたうえでClickOnceを公開し、クライアントで実行すると以下のエラーが表示される。 このアプリケーションをインストールまたは実行できません。このアプリケーションでは、まずグローバルアセンブリキャッシュ(GAC)にアセンブリ Microsoft.**** バージョン *** をインストールする必要があります。 ****にはVisualStudio関連のアセンブリ各種が出力される。Visual Studio 2017 Express Desktopの時は発生しなかったのだが、2017 Professionalにしたら発生した。 どうも必要なアセンブリ(.dll)を添付できていないようで、事例は異なるが、 http://thinkami.hatenablog.com/entry/2014/09/09/062440 にあるように公開設定で全てのアセンブリを「必須コンポーネント(自動)」→「含む」に変更すると解消した。

<span title='2018-07-30 00:00:00 +0900 +0900'>July 30, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41