実機だけで発生する例外
実機上で以下のコードを実行すると
string from = ""; Type fromType = from.GetType(); TypeConverter converter = TypeDescriptor.GetConverter(from);
三行目のConverterを取得する所で
System.MissingMethodException: Default constructor not found for type System.ComponentModel.StringConverter.
という例外が発生する。シミュレータでは発生しない。バグ?
追記1
TypeDescriptor.GetConverterの中を解析した結果、
object obj = Activator.CreateInstance(typeof(System.ComponentModel.StringConverter));
のところで例外になっていた。
object obj = Activator.CreateInstance(typeof(System.Exception));
だと例外にはならないのでやっぱりバグなのか?
追記2
NovellのBugzillaに登録してみた。どうなる?
追記3
リンカの問題だった。
実機用のネイティブコードにコンパイルするときに未使用のコード(クラス、コンストラクタ、プロパティ、メソッド等々)をバイナリにリンクしないようにする機能が原因。
この問題を回避するには
- プロジェクトの設定→ビルド→iPhone Build→Linker behaviorをDon't linkにする
- プログラムのどこかでSystem.ComponentModel.StringConverterクラスをインスタンス化する
があるとのこと。
1.は副作用として出力されるバイナリが(かなり)でかくなる。
2.に関してはインスタンス化しさえすればいいので
if (false) { var aa = new System.ComponentModel.StringConverter(); }bool aa = false; if (aa) { var aa = new System.ComponentModel.StringConverter(); }
という意味のないコードでも良い。しかしこれではリフレクションの役割を果たせていないのではないだろうか・・・
追記4
追記3のサンプルが間違っていたので修正した