窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

.NET5でWPFなアプリケーションをPublishTrimmedしようとしたらTrimしすぎたのでIgnoreしていい感じにする

メモです。

最近DMM版ウマ娘の画面サイズ自動変更ツールのUIをWPF化しようとしていた時に起こった事象。

.NET Core 3.1からアプリケーションをpublishする時にリンクしているアセンブリの不使用な部分をパッケージから削除する機能が追加されています。

docs.microsoft.com

これを使用してWPFなアプリケーションのTrimを行ったところ、アプリケーションが実行時にクラッシュしてしまいました。 イベントビューアでエラーを確認したところ

Application: UmaMadoManager.Windows.exe
CoreCLR Version: 5.0.521.16609
.NET Version: 5.0.5
Description: The process was terminated due to an unhandled exception.
Exception Info: System.TypeInitializationException: The type initializer for 'System.Windows.FrameworkElement' threw an exception.
 ---> System.TypeInitializationException: The type initializer for 'System.Windows.Documents.TextElement' threw an exception.
 ---> System.TypeInitializationException: The type initializer for 'System.Windows.Documents.Typography' threw an exception.
 ---> System.IO.FileNotFoundException: 
File name: 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at System.Windows.Media.TextFormatting.TextRunTypographyProperties.OnPropertiesChanged()
   at MS.Internal.Text.TypographyProperties.ResetProperties()
   at MS.Internal.Text.TypographyProperties..ctor()
   at System.Windows.Documents.Typography..cctor()
   --- End of inner exception stack trace ---
   at System.Windows.Documents.TextElement..cctor()
   --- End of inner exception stack trace ---
   at System.Windows.FrameworkElement..cctor()
   --- End of inner exception stack trace ---
   at System.Runtime.CompilerServices.RuntimeHelpers._RunClassConstructor(RuntimeType type)
   at System.Windows.DependencyProperty.FromName(String name, Type ownerType)
   at System.Windows.Baml2006.WpfXamlType.FindDependencyPropertyBackedProperty(String name, Boolean isAttachable, Boolean skipReadOnlyCheck)
   at System.Windows.Baml2006.WpfXamlType.FindMember(String name, Boolean isAttached, Boolean skipReadOnlyCheck)
   at System.Windows.Baml2006.WpfXamlType.LookupMember(String name, Boolean skipReadOnlyCheck)
   at System.Xaml.XamlType.GetMember(String name)
   at System.Windows.Baml2006.Baml2006SchemaContext.GetProperty(Int16 propertyId, XamlType parentType)
   at System.Windows.Baml2006.Baml2006Reader.Process_PropertyWithStaticResourceId()
   at System.Windows.Baml2006.Baml2006Reader.Process_OneBamlRecord()
   at System.Windows.Baml2006.Baml2006Reader.ReadObject(KeyRecord record)
   at System.Windows.ResourceDictionary.CreateObject(KeyRecord key)
   at System.Windows.ResourceDictionary.OnGettingValue(Object key, Object& value, Boolean& canCache)
   at System.Windows.ResourceDictionary.OnGettingValuePrivate(Object key, Object& value, Boolean& canCache)
   at System.Windows.ResourceDictionary.GetValueWithoutLock(Object key, Boolean& canCache)
   at System.Windows.ResourceDictionary.GetValue(Object key, Boolean& canCache)
   at System.Windows.ResourceDictionary.GetValueWithoutLock(Object key, Boolean& canCache)
   at System.Windows.ResourceDictionary.GetValue(Object key, Boolean& canCache)
   at System.Windows.ResourceDictionary.get_Item(Object key)
   at System.Windows.Application.FindResource(Object resourceKey)
   at UmaMadoManager.Windows.App.OnStartup(StartupEventArgs e)
   at System.Windows.Application.<.ctor>b__1_0(Object unused)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at System.Windows.Application.Run()
   at UmaMadoManager.Windows.App.Main()

以下のようなエラーが発生していました。

Exceptionでぐぐってみたら

github.com

こんなIssueが引っかかった。

Trimming default WPF app breaks it · Issue #14261 · dotnet/sdk · GitHub

ここらへんで詳しい原因を述べていているで気になる方はこちらをチェック。

とりあえずWorkaroundとして載せられている

<ItemGroup>
    <TrimmerRootAssembly Include="System.Runtime"/>
    <TrimmerRootAssembly Include="System.Runtime.Extensions"/>
    <TrimmerRootAssembly Include="System.Diagnostics.Debug"/>
</ItemGroup>

こいつをcsprojに追記してとりあえず動作するようになった。 やっぱり動作するかのテスト追加しないとだなー

2020年に買ってよかったものを眺めてみる

VOYAGE GROUP Techlog Advent Calendar 2020 の3日目の記事です。

今年も残す所わずかとなった12月、この1年の間に何を買ってきたか振り返りをしてみようかなと思います。

家電・ガジェット系

WFHが本格化したこともあり、今年はいつもに比べて割と買ったなという印象があります。

MSI Optix G24C4 ゲーミングモニター VA湾曲パネル

高校に入学してからずっと使っていた(約12年間?)液晶ディスプレイを眺めていると目が非常に疲れてしまい、そろそろ新しいディスプレイを使ってみたいなと思っていた所出会ってしまった一品。 店頭で試すこともせずとりあえずでポチったので、初めての湾曲どうなることかと思いましたが良かった。 サイズの割に端から端まで見やすく、色の設定も柔軟で目の疲れも軽減した気がする。

Amazonベーシック モニターアーム デュアル ディスプレイタイプ

今まで使っていたディスプレイにはVESAマウンタがなくて使うことがなかったけれども、同時に買ったディスプレイにVESAマウンタが付いていたのでどうせなら挑戦してみようということで購入。 ディスプレイの高さの調整のために古本を敷いてその上にディスプレイを置くみたいな運用がなくなったため机が広くなった。 また椅子を倒した時にも見やすい角度に出来たりと良かった。 今使っている机に背板があるため取り付けが困難かと思ったけれども、クランプの開閉域が割と広くて挟むために細工した板を当てても問題なく挟み込むことが出来た。

エレコム 電源タップ 雷ガード 10個口 ほこりシャッター付

ディスプレイを増やしたためコンセントが足りなくなったので購入。 コンセントの一つ一つの幅が割と広めで複数の機器を一つのタップで管理しやすくなった。

final E1000C カナル型イヤホン マイク付きコントローラー

家族のいる部屋でMTGに参加する時に外の音が聞こえて集中できなかったため購入。 非常に遮音性に優れ、マイクの音質も良かった。 何よりも軽量で音導管が細くイヤピースのサイズも今までに使ったイヤホンの中でも最も小さいものが使用できて、初めてフィットしたイヤホンだった。 最近はもっぱら音ゲー用に使われている。

ag TWS04K Bluetooth ワイヤレス 完全独立型 左右分離型 イヤホン

E1000Cでも十分に満足できたけれども、やはりコードが有ることの煩わしさがあった。 ワイヤレスで遮音性の高いイヤホンを探していた所友人に勧められ購入。 E1000Cの良かった所全てを引き継いだイヤホンでもう全部こいつでいいんじゃないかみたいになっている。 最近のMTGは全てこれで参加している。 充電の持ちもよく、使ったら使いっぱなしの私にぴったりだった。

生活用品・その他

nichie 有機 ルイボスティー

WFHが始まったころ生活が乱れに乱れ睡眠に問題が起こっていた。 コーヒーの飲みすぎで震えも出たこともありノンカフェインなドリンクが欲しいと思って購入。 ノンカフェイン目的だったけど味が良かったのでリピしている。

ギャバ(GABA) 30日分

これもWFH始めた頃に買った。 最初飲んだ時はプラシーボなのかどうか判断できないけれども、ぐっすり眠りすぎて翌日大幅に遅刻したことを覚えている。

HARIO V60 コーヒーサーバー & コーヒードリッパー

弊社はGardenというバリスタの常駐している社内カフェがあるのだけれども、WFHになって通うことが出来なくなった。

voyagegroup.com

家でも美味しいコーヒーを飲むことが出来ないものかと知り合いに聞いていたらエントリーモデルとしてオススメとのことで購入。 自分でゆっくりコーヒーを淹れるという体験とその時に広がるコーヒーの香りで疲れを忘れさせてくれる。 次はケトルを買おうと考えている。

桐灰化学 あずきのチカラ 目もと用

WFHになってから出社することがなくなり遠くを見つめることがほぼなくなった。 見つめているのはディスプレイのみみたいな状態が続き目が疲れているのは感じていたので購入。 実際効いているのかわからないけれども、気持ちいいので続けている。

SIHOO人間工学 オフィスデスクチェア

9年人生を共にしたニ○リのパイプ椅子(っぽやつ)にクッションを敷いたり毛布をかけたりと色々と工夫を凝らして座ってきたが、とうとう腰とお尻にダメージが来た。 私のケツを守るために9年の思い出と訣別した、ケツだけに…………

本当は会社で使っているような椅子が欲しいけれども、どれも10万円近い値段なのでとりあえずお試しで購入。 肘掛けの位置が微妙だったり、ガタツキが一部あり不安を覚えるが、パイプ椅子に比べたら雲泥の差なので非常に満足している。

ルックプラス バスタブクレンジング

出勤していたころは時間がなくてシャワーで済ませがちだったけれども、WFHになって時間が生まれ、また気分をリフレッシュさせるために湯船に浸かることが増えた。 そうなると風呂掃除の回数も相対的に増えて手間だったけれども、洗剤をこれに変えてからゴシゴシ頑張って洗うことがなくなって大分楽になった。 今までと浴室の綺麗さは変わっていないように見えるので、効果はてきめんなのかもしれない。

クリニカ アドバンテージハブラシ 4列 超コンパクト

リモート飲み会が増えてそのまま机で寝てしまうみたいなことが一時期急増していた。 そうなると一気に口内環境が悪化して口臭が…みたいなことが起きてしまったのでもっとちゃんと磨くぞってことで購入。 非常にヘッドが小さいので奥まで磨けて良い。すごい歯磨きに時間がかかるけれども…

NONIO(ノニオ) [医薬部外品] ハミガキ クリアハーブミント

上の流れで購入

NONIO(ノニオ) [医薬部外品] ハミガキ クリアハーブミント 単品 130g×2個

NONIO(ノニオ) [医薬部外品] ハミガキ クリアハーブミント 単品 130g×2個

  • 発売日: 2017/08/30
  • メディア: ヘルスケア&ケア用品

NONIO(ノニオ) 舌クリーナー+舌専用クリーニングジェル

これもその流れで買った

おわりに

WFH起因で買ったものが多い1年でした。 生活様式の変化によってあったらいいなぁというものがどんどん変わっていくのは興味深いですね。