自分のアプリで特定の言語でのみ起動できないバグがあった

自分のアプリで特定の言語でのみ起動できないバグがあった。

具体的にはタイ語の人だった。

最初自分の手元では再現せず全然原因が分からなかったが、自分のスマホの言語設定をタイ語にして試してみたら再現した。

2021/09/08 10:51:10.871 13160 13341 Error Unity ArgumentOutOfRangeException: Not a valid calendar for the given culture.
2021/09/08 10:51:10.871 13160 13341 Error Unity Parameter name: value
2021/09/08 10:51:10.871 13160 13341 Error Unity   at System.Globalization.DateTimeFormatInfo.set_Calendar (System.Globalization.Calendar value) [0x00000] in <00000000000000000000000000000000>:0 
2021/09/08 10:51:10.871 13160 13341 Error Unity   at System.Globalization.CultureInfo.get_DateTimeFormat () [0x00000] in <00000000000000000000000000000000>:0 
2021/09/08 10:51:10.871 13160 13341 Error Unity   at System.Globalization.CultureInfo.GetFormat (System.Type formatType) [0x00000] in <00000000000000000000000000000000>:0 
2021/09/08 10:51:10.871 13160 13341 Error Unity   at System.Globalization.DateTimeFormatInfo.get_CurrentInfo () [0x00000] in <00000000000000000000000000000000>:0 
2021/09/08 10:51:10.871 13160 13341 Error Unity   at System.DateTime.ToString () [0x00000] in <00000000000000000000000000000000>:0 

というようなエラー。DateTimeをToString()するときに出ていたようだ。
今までもTryParseで死ぬことはあったが、ToString()でもあかんとは知らなかった。
とりあえずテキトーなCultureInfoを作ってToString()の引数に渡すことで回避できました。

static public readonly System.Globalization.CultureInfo StandardCulture = new System.Globalization.CultureInfo("en-US");
Data.SaveDateTimeString = DateTime.UtcNow.ToString(@"yyyy/MM/dd HH:mm:ss ddd", StandardCulture);


P.S
以下のような解決方法もあるらしい。ライブラリの中身で死ぬこともあるから、こちらのほうが対応としては良さそう。バイナリサイズもほとんど増えなかった。
issuetracker.unity3d.com


link.xmlに以下を記述して、Assets以下に置いておくだけ。

 <linker>
 <assembly fullname="mscorlib">
 <namespace fullname="System.Globalization" preserve="all"/>
 </assembly>
 </linker>