5

リンク SDK アセンブリを xamarin studio でのみ使用すると例外が発生し、dont link を使用すると例外は発生しません。この問題は、私が使用しているサード パーティの dll (ビデオ ストリーミング サービスの API) の一部であることがわかりました。リンカーは、この dll で使用されるメソッドの一部を削除していると思います。一部のライブラリのリンクをスキップすることは可能ですか?また、このスタックトレースからどれを確認することは可能ですか?

    2013-05-08 14:40:54.688 AppsfabrikkenTouch[5662:907] mvx: Diagnostic:  18,23 Exception masked NullReferenceException: Object reference not set to an instance of an object
      at System.Delegate.Combine (System.Delegate a, System.Delegate b) [0x00018] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Delegate.cs:473 
  at Cirrious.MvvmCross.ViewModels.MvxNotifyPropertyChanged.add_PropertyChanged (System.ComponentModel.PropertyChangedEventHandler value) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Bindings.Source.MvxBasePropertyInfoSourceBinding..ctor (System.Object source, System.String propertyName) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Bindings.Source.MvxPropertyInfoSourceBinding..ctor (System.Object source, System.String propertyName) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Bindings.Source.Construction.MvxSourceBindingFactory.CreateBinding (System.Object source, IEnumerable`1 childPropertyNames) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Bindings.Source.Construction.MvxSourceBindingFactory.CreateBinding (System.Object source, System.String combinedPropertyName) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Binders.MvxFullBinding.CreateSourceBinding (System.Object source) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Binders.MvxFullBinding..ctor (Cirrious.MvvmCross.Binding.Interfaces.MvxBindingRequest bindingRequest) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Binders.MvxFromTextBinder.BindSingle (Cirrious.MvvmCross.Binding.Interfaces.MvxBindingRequest bindingRequest) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Binders.MvxFromTextBinder+<>c__DisplayClass1.<Bind>b__0 (Cirrious.MvvmCross.Binding.Interfaces.MvxBindingDescription description) [0x00000] in <filename unknown>:0 
  at System.Linq.Enumerable+<CreateSelectIterator>c__Iterator1D`2[Cirrious.MvvmCross.Binding.Interfaces.MvxBindingDescription,Cirrious.MvvmCross.Binding.Interfaces.IMvxUpdateableBinding].MoveNext () [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.List`1[Cirrious.MvvmCross.Binding.Interfaces.IMvxUpdateableBinding].AddEnumerable (IEnumerable`1 enumerable) [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.List`1[Cirrious.MvvmCross.Binding.Interfaces.IMvxUpdateableBinding].AddRange (IEnumerable`1 collection) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Touch.ExtensionMethods.MvxBindingTouchExtensions.AddBindings (IMvxBindingTouchView view, IEnumerable`1 bindings) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Touch.ExtensionMethods.MvxBindingTouchExtensions.AddBindings (IMvxBindingTouchView view, System.Object source, System.Object target, System.String bindingText) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Touch.ExtensionMethods.MvxBindingTouchExtensions.AddBindings (IMvxBindingTouchView view, System.Object source, IDictionary`2 bindingMap) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Touch.ExtensionMethods.MvxBindingTouchExtensions.AddBindings (IMvxBindingTouchView view, IDictionary`2 bindingMap) [0x00000] in <filename unknown>:0 
  at CmsApp.Touch.TabTextView.ViewDidLoad () [0x00074] in /Volumes/2end HDD/Dropbox/AppProjects/Appsfabrikken/CmsApp.Touch/Views/UmbracoViews/TabTextView.cs:45 
  at MonoTouch.UIKit.UINavigationController.PushViewController (MonoTouch.UIKit.UIViewController viewController, Boolean animated) [0x00019] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UINavigationController.g.cs:178 
  at CmsApp.Touch.AppPhonePresenter.Show (IMvxTouchView view) [0x0007b] in /Volumes/2end HDD/Dropbox/AppProjects/Appsfabrikken/CmsApp.Touch/AppPhonePresenter.cs:62 
  at Cirrious.MvvmCross.Touch.Views.Presenters.MvxTouchViewPresenter.Show (Cirrious.MvvmCross.Views.MvxShowViewModelRequest request) [0x00000] in <filename unknown>:0 
  at CmsApp.Touch.AppPhonePresenter.Show (Cirrious.MvvmCross.Views.MvxShowViewModelRequest request) [0x00000] in /Volumes/2end HDD/Dropbox/AppProjects/Appsfabrikken/CmsApp.Touch/AppPhonePresenter.cs:37 
  at Cirrious.MvvmCross.Touch.Views.MvxTouchViewDispatcher+<>c__DisplayClass1.<RequestNavigate>b__0 () [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Touch.Views.MvxTouchUIThreadDispatcher+<>c__DisplayClass1.<InvokeOrBeginInvoke>b__0 () [0x00000] in <filename unknown>:0 

どんな助けでも大歓迎です。

更新: stuart が提案したように (stuart に感謝)、LinkerPleaseInclude ファイルを次のように追加しました: しかし、それでも例外が発生します。

class LinkerIncludePlease
    {
        private void DelegateCombine(Delegate a, Delegate b)
        {
            var d = Delegate.Combine(a,b);
        }

        private void DelegateCombine(params Delegate[] delegates)
        {
            var d = Delegate.Combine(delegates);
        }

        private void DelegateCombine()
        {
            var d = Delegate.Combine();
        }

    }

私の考えでは、それはスタックトレースに関連するものでなければなりませんでした

Exception masked NullReferenceException: Object reference not set to an instance of an object
          at System.Delegate.Combine (System.Delegate a, System.Delegate b) [0x00018] 

しかし、それはうまくいかないようです-何が取り除かれているかを見つけるための指針はありますか?

4

3 に答える 3

6

一部のライブラリのリンクをスキップすることは可能ですか

はい。--linkskip=ASSEMBLYオプション (プロジェクトのオプションの追加の mtouch 引数内) を使用して、問題をサード パーティに切り分けることができます (その原因を 100% 確信することができます)。リリースの回避策としても使用できます(ただし、リンカーの利点を最大限に活用するには、より正確な解決策を見つけたほうがよいでしょう)。

たとえば--linkskip=mscorlib、mscorlib.dll をスキップします (つまり、ファイル拡張子なし)。

このスタックトレースからどれを確認できますか?

そうではありません。問題はありませんSystem.Delegate.Combine。スタック トレースで名前が付けられているため、リンカーによって削除されていないことがわかります。

OTOH の引数の 1 つ (デリゲート) が削除される可能性があります。これは、リフレクションを使用して作成された場合に (ほとんどの場合) 発生する可能性があります (リンカーは静的分析を使用するため)。スタック トレースを使用して、Combine呼び出しで使用された (タイプ) を確認し、そこから逆方向に作業することができます。たとえば、それがどのように作成されたかを見つけることができます。

見つけたら、リンカーにそれを保持させたいと思うでしょう。余分な不要なコードを追加することでこれを行うことができます(@Stuartが提案したように)。私自身の提案は次のとおりです。

  • [Preserve]ソースコードがある場合は属性を使用します。

  • ソース コードがない場合は、 XML ファイル(および) を使用します。--xml=file

于 2013-05-08T16:40:04.710 に答える
1

リンカーがその仕事をしているときに、何が欠けているのかを見つけることができませんでした。

しかし、あるバインディング中に、ビデオ API が同期性 restsharp 呼び出しを行っていたため、バインディングが完了するまで待機していたため、問題が発生しているように見えました。ワークフローを変更して非同期の restsharp 呼び出しを開始すると、完了時にバインドが開始され、すべてが魅力的に機能しました。

大変お世話になりました。

于 2013-05-19T04:54:51.680 に答える