2013-05-08 14 views
5

Ich habe ein irritierendes Problem, wenn ich Link SDK Assemblys nur in Xamarin Studio verwende ich bekomme eine Ausnahme, wenn ich nicht Link die Ausnahme nicht geschieht. Ich habe das Problem gefunden, um Teil einer Drittanbieter-DLL zu sein, die ich verwende (API für einen Video-Streaming-Dienst). Ich glaube, der Linker entfernt einige der Methoden, die von dieser DLL verwendet werden. Ist es möglich, Link von einigen Bibliotheken zu überspringen und ist es möglich, zu sehen, welche von diesem Stacktrace.Probleme mit xamarin.ios/monotouch, mvvmcross und Verknüpfung

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 

Jede Hilfe wird geschätzt.

UPDATE: Wie von Stuart vorgeschlagen (Danke Stuart) Ich habe eine LinkerPleaseInclude-Datei mit den folgenden hinzugefügt: Aber es wird immer noch eine Ausnahme erhalten.

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(); 
     } 

    } 

Mein Gedanke war, dass es hatte etwas mit Bezug werden, um die stacktrace

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

Aber es scheint nicht, den Trick zu tun - alle Hinweise zu finden, was aus abgestreift?

+0

Nach dem Update> Ich denke, Sie haben das falsche Objekt/Eigenschaft in Ihrem Linkerpleaseinclude hinzugefügt - Sie müssen auf die get/set, was auch immer die Eigenschaft ist, die Sie abonnieren - zB .Text, .Video,. Was auch immer – Stuart

+0

Du bist total korrekt wie immer stuart, aber es ist leider nicht mein Problem hier :( – Bjarke

Antwort

1

Ich konnte nicht finden, was fehlte, als der Linker seine Arbeit machte.

Allerdings habe ich festgestellt, dass während einer Bindung der Video-API einen synchronen Restanruf durchführte, der die Bindung bis zum Ende warten ließ und dies schien das Problem zu verursachen. Wenn ich den Arbeitsablauf geändert und einen asynchronen RESTHARP-Aufruf gestartet habe, der dann die Bindung startet, funktionierte alles wie ein Zauber.

Vielen Dank für Ihre Hilfe.

5

Ist es möglich, skip Link einiger Bibliotheken

Ja. Sie können das Problem mit der Option --linkskip=ASSEMBLY (unter Zusätzliche MTOUCH-Argumente in den Optionen Ihres Projekts) isolieren. Es kann auch als Release Problemumgehung verwendet werden (aber Sie finden besser eine genauere Lösung, um die vollen Vorteile des Linkers zu erhalten).

z. --linkskip=mscorlib würde überspringen mscorlib.dll (das heißt keine Dateierweiterung)

ist es möglich, die von diesem stacktrace zu sehen?

Nicht ganz. Das Problem ist nicht mit System.Delegate.Combine. Da es im Stack-Trace benannt ist, wissen Sie, dass es nicht vom Linker entfernt wird.

OTOH eines der Argumente (ein Delegat) wird wahrscheinlich entfernt. Dies kann (höchstwahrscheinlich) passieren, wenn es mithilfe von Reflektion erstellt wurde (da der Linker statische Analyse verwendet). Sie können den Stack-Trace verwenden, um zu sehen, welcher (Typ) in dem Combine-Aufruf verwendet werden sollte, und von dort rückwärts zu arbeiten, z. zu finden, wie es erstellt wurde.

Sobald Sie es finden, werden Sie wollen, dass der Linker es behält. Sie können dies tun, indem Sie zusätzlichen, nicht benötigten Code hinzufügen (wie bei @Stuart vorgeschlagen). Meine eigenen Vorschläge sind:

  • Verwendung [Preserve] Attribute, wenn Sie den Quellcode haben;

  • Verwenden Sie eine XML file (und --xml=file), wenn Sie nicht den Quellcode haben;