2013-05-08 8 views
5

Ho un problema irritante, se uso gli assembly Link SDK solo in xamarin studio ottengo un'eccezione, se uso non collego l'eccezione non sta accadendo. Ho individuato il problema per far parte di una dll di terze parti che sto utilizzando (API per un servizio di streaming video). Credo che il linker stia eliminando alcuni dei metodi usati da questa DLL. E 'possibile saltare il collegamento di alcune librerie ed è possibile vedere quale da questo stacktrace.Problemi con xamarin.ios/monotouch, mvvmcross e collegamento

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 

Qualsiasi aiuto è apprezzato.

AGGIORNAMENTO: Come suggerito da stuart (grazie stuart) Ho aggiunto un file LinkerPleaseInclude con il seguente: Ma ottiene comunque un'eccezione.

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

    } 

Il mio pensiero era che doveva essere qualcosa legato al 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] 

Ma sembra di non fare il trucco - tutti i puntatori a trovare ciò che è spogliato fuori?

+0

Dopo l'aggiornamento> Penso che tu abbia aggiunto l'oggetto/proprietà errato nel tuo linkerpleaseinclude - devi fare riferimento al get/set qualunque sia la proprietà a cui ti stai iscrivendo - eg .Text, .Video, .Whatever – Stuart

+0

Sei completamente corretto come sempre stuart, ma purtroppo non è il mio problema qui :( – Bjarke

risposta

1

Non sono riuscito a trovare ciò che mancava, quando il linker stava facendo il suo lavoro.

Tuttavia ho trovato che durante una rilegatura, la video api stava eseguendo una chiamata di sincronizzazione sincrona che ha reso l'associazione attesa fino al termine e questo sembrava causare il problema. Se ho cambiato il flusso di lavoro e avviato una chiamata restsharp asincrona, che poi avvia l'associazione al termine, tutto ha funzionato come un incantesimo.

Grazie mille per il vostro aiuto.

5

E 'possibile saltare collegamento di alcune librerie

Sì. Puoi isolare il problema (ed essere sicuro al 100% della sua origine) dal tuo terzo utente usando l'opzione --linkskip=ASSEMBLY (in Ulteriori argomenti di mtouch nelle opzioni del tuo progetto). Può essere utilizzato come soluzione versione (ma è meglio trovare una soluzione più precisa per ottenere tutti i vantaggi dal linker).

E.g. --linkskip=mscorlib salta mscorlib.dll (cioè senza estensione file)

è possibile vedere quale da questo stacktrace?

Non proprio. Il problema non è con System.Delegate.Combine. Dal momento che è denominato nello stack trace, allora sai che non viene rimosso dal linker.

OTOH una delle sue argomentazioni (un delegato) è probabilmente rimossa. Ciò può (molto probabilmente) accadere se è stato creato usando la reflection (poiché il linker usa l'analisi statica). Puoi utilizzare la traccia dello stack per vedere cosa (tipo) avrebbe dovuto essere utilizzato nella chiamata e lavorare indietro da lì, ad es. per scoprire come è stato creato.

Una volta trovato, il linker lo manterrà. Puoi farlo aggiungendo altro codice non necessario (come suggerito da @Stuart). I miei suggerimenti sono:

  • uso [Preserve] attributi quando si ha il codice sorgente;

  • utilizzare un XML file (e --xml=file) quando non si dispone del codice sorgente;