2012-04-13 2 views
0

私はMonoTouchがメソッドをコンパイルしていないか、呼び出されるようにコンパイルされたメソッドを見つけられないようだが、Releaseコンフィグレーションのデバイスのビルドでのみ問題がある。私は運がないより単純なコードサンプルでそれを再現しようとしました。だから、以下のコードでその動作を見ることはできません。MonoTouchは不思議なことに、メソッドやプロパティをコンパイルしませんか?

using System; 
using MonoTouch.UIKit; 

public class MyClass 
{ 
    private UINavigationController _navController; 
    private UIViewControler _viewController; 

    public UINavigationController NavController 
    { 
     get 
     { 
      if (_navController == null) 
      { 
       if (_viewController == null) 
       { 
        _viewController = new UIViewController(); 
       } 
       _navController = new UINavigationController(_viewController); 
      } 
      return _navController; 
     } 
    } 
} 

をその後、いくつかの他の方法では...

public void SomeMethod() 
{ 
    MyClass myClass = new MyClass(); 
    var navController = myClass.NavController; // <-- This is where it throws 
} 

私が手に例外をされている標準のJITコンパイルメッセージを、それがJITにしようとしたことを言って:しかし、これは私がやっている本質的ですget_NavController()。仮想ジェネリックス、LINQ、リンカーがオフで、通常はJITを引き起こすものは何も関与していないため、これは非常に奇妙です。私はまた、MyClassで定義された他のメソッドやプロパティに対してはコンストラクタやSystem.Objectの継承されたメソッドではスローされないことを確認しました。 Reflectionは、myClass.GetType().GetMembers()には私が期待するすべてのもののMemberInfoがあることが明らかになりました。ただし、の場合、これらのメソッドまたはプロパティにアクセスすることはできません。リリース| iPhoneの場合のみです。私が来ることができる唯一の論理的な結論は、aotコンパイルのステップではそれらが欠けているということです。なぜそれが起こるのかわかりません。リリースの設定だけではありません。

私の質問は、このような状況を引き起こす原因となる可能性があり、それを修正するための次のステップは何ですか?私は、私たちの(もっと)大規模なプロジェクトの文脈からそれを再現することができないので、これをデバッグする際にここからどこに行くのか、あるいはバグを何に書き込むのかについては不明です。

更新:正確な例外テキストが要求されました。

System.ExecutionException: Attempting to JIT compile method 
'MyNamespace.MyClass.get_NavController()' while running with --aot-only 
+0

"NavController"の役割について説明できますか?それは方法ではなく(括弧なし)、どちらもゲッターではありません。それはすべての問題になるでしょうか? – Krumelur

+0

はい、それはゲッターを持つプロパティです。私は私の省略を修正するコードを更新しました。 –

答えて

1

これはここで解決できるもののようには見えません。

小さなテストケースを作ることができない場合は、バグを提出し、プロジェクト全体を添付することをお勧めします。プライベートバグを報告することができます.Xamarinの従業員だけが、プロジェクトを一般に公開したくない場合にアクセスできます。これはクラスの内部ではないかもしれないと呼ばれるUIViewController.ViewDidLoad方法を待つ必要が関連付けられているすべてである場合

+0

私はソース全体を添付する権限がありませんが、バグを報告してバイナリを添付します。 –

+1

原因を切り離しました。 MonoDevelopには、iOSアプリケーションでもあるアセンブリを参照するときにバグがあります。これは、通常のコンパイルされたexeファイルではなく、アプリケーションバンドル内の削除されたアセンブリへのパスをコンパイラに渡します。リンク:https://bugzilla.xamarin.com/show_bug.cgi?id=4530 –

0

は、明示的または変数

UINavigationController navController = myClass.NavController; 

を宣言しようとすることができ、私は疑問に思いますまだ初期化されていますか?

ここでは暗闇の中でちょうどいいショットをしているので、あなたのコードがうまくいかない理由は考えられません。

+0

実際のコードでは、プロパティは関数の引数として渡されていますが、どのように使用するにしてもスローされます。コードは、ビューやコントローラだけでなく過去には機能していませんでした。私はまだそれが壊れたときに正確に追跡しています。 –

+0

私には、周りにコグが動き回っていることが示されています。上に示したコードは実際の犯罪者ではなく、おそらく実行時の他のものと関連している可能性があります。リフレクションを使ってそのメソッドを呼び出すのですか?私は正直なところ、上記のコードがどこにでも明示的に参照されていないことを除いて、他の理由を考えることはできません。したがって、可能な限り小さな実行可能ファイルを作成するために参照されないので、iOSコンパイラはコードを削除します。 – AkiAki007

+0

質問に記載されているとおり、プロパティはリフレクションによって呼び出されていません。 –

関連する問題