麻烦xamarin.ios / MonoTouch的,mvvmcross和链接(Trouble wi

2019-09-02 05:43发布

我有一个刺激性的问题,如果我只在xamarin工作室我得到一个例外,如果我不要使用链接的异常没有发生使用链接SDK组件。 我已经找到了问题是我使用(API用于视频流服务)的第三方DLL的一部分。 我相信接头剥离一些通过这个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 

任何帮助表示赞赏。

更新:由于斯图尔特(感谢司徒)建议我增加了一个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] 

但似乎没有这样的伎俩 - 任何指针,以查找被剥离出来?

Answer 1:

是否有可能跳过一些库的链接

是。 您可以隔离问题(并100%地肯定它的起源)使用您的第三方--linkskip=ASSEMBLY (在项目的选择在其他的mTouch参数 )选项。 它可以作为一个释放的解决方法太(但你最好找一个更精确的解决方案,使从连接器的全部好处)。

例如--linkskip=mscorlib将跳过mscorlib.dll中(即无文件扩展名)

是不是可以看到,从这个堆栈跟踪?

不完全的。 这个问题是不是与System.Delegate.Combine 。 因为它是在堆栈跟踪命名那么你知道它不是通过链接删除。

它OTOH一个论点(委托)很可能删除。 如果它是使用反射(由于链接使用静态分析)创建了一个可以(最有可能)会发生。 您可以使用堆栈跟踪,看看有什么(类型)应该已经在使用了Combine呼吁,并从那里落后的工作,如发现它是如何创建的。

一旦你找到它,你会想链接器保留它。 您可以通过添加额外的,不必要的代码(如@Stuart建议)这样做。 我自己的建议是:

  • 使用[Preserve]当你有源代码属性;

  • 使用XML文件 (和--xml=file ),当您没有源代码;



Answer 2:

不能与无名的视频API帮助。

但要解决Mvvmcross链接问题:

  • 你需要找出哪些页/视图 - 控制链接器错误是发生在。

  • 然后你只需要添加一个LinkerPleaseInclude.cs文件欺骗连接到不删除任何符号被剥

这里有一个例子: https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/DailyDilbert/DailyDilbert.Touch/LinkerPleaseInclude.cs



Answer 3:

我没能找到少了什么,当接头做其工作。

但是我发现有一个结合的过程中,视频API在做这使得结合等到完成,这似乎导致该问题的同步restsharp电话。 如果我换了工作流程,并开始一个异步调用restsharp,然后开始做绑定的时候,它的所有工作作为一个魅力。

谢谢你合租太多的帮助。



文章来源: Trouble with xamarin.ios/monotouch , mvvmcross and linking