2013-05-08 3 views
5

У меня есть раздражающая проблема, если я использую Link SDK Assemblies только в студии xamarin. Я получаю исключение, если я использую dont link, исключение не происходит. Я решил, что проблема будет частью сторонней dll, используемой мной (api для службы потоковой передачи видео). Я считаю, что компоновщик лишает некоторые методы, используемые этой DLL. Возможно ли пропустить ссылку некоторых библиотек, и можно ли увидеть, какой из них находится в стеке.Проблема с xamarin.ios/monotouch, mvvmcross и ссылкой

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 

Любая помощь приветствуется.

UPDATE: Как было предложено 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(); 
     } 

    } 

Моя мысль была, что это должно было быть что-то связано с 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] 

Но, похоже, не делать трюк - любые указатели, чтобы найти то, что раздели?

+0

После обновления> Я думаю, вы добавили неправильный объект/свойство в свой linkerpleaseinclude - вам нужно ссылаться на get/set независимо от того, на что вы подписаны - например .Text, .Video, .Whatever – Stuart

+0

Вы абсолютно правы, как всегда stuart, но, к сожалению, это не моя проблема :( – Bjarke

ответ

1

Я не смог найти то, чего не хватало, когда компоновщик выполнял свою работу.

Однако я обнаружил, что во время одной привязки видео api выполняло синхронный вызов restsharp, который заставил привязку ждать до завершения, и это, казалось, вызвало проблему. Если я изменил рабочий процесс и начал асинхронный вызов restsharp, который затем начал привязку, когда все было сделано, все это работало как прелесть.

Благодарим вас за помощь.

4

Невозможно помочь с неназванным видео api.

Но работать вокруг вопросов, связывающих Mvvmcross:

  • Вам нужно выяснить, что страница/ViewController компоновщика ошибка происходит на.

  • Тогда вам просто нужно добавить файл LinkerPleaseInclude.cs обмануть линкер в не вынимая любой символ его зачистки

Вот пример: https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/DailyDilbert/DailyDilbert.Touch/LinkerPleaseInclude.cs

5

Можно пропуск ссылки некоторых библиотек

Да. Вы можете изолировать проблему (и быть на 100% уверенной в ее происхождении) третьей стороне, используя опцию --linkskip=ASSEMBLYДополнительные аргументы mtouch в вариантах вашего проекта). Его можно использовать как обходное решение (но лучше найти более точное решение, чтобы получить все преимущества от компоновщика).

E.g. --linkskip=mscorlib будет пропускать mscorlib.dll (т.е. без расширения файла)

это можно увидеть, какие из этого StackTrace?

Не совсем. Вопрос не с System.Delegate.Combine. Поскольку он указан в трассировке стека, вы знаете, что он не удаляется компоновщиком.

OTOH один из аргументов (делегат), вероятно, удален. Это может (скорее всего) произойдет, если оно было создано с использованием рефлексии (поскольку компоновщик использует статический анализ). Вы можете использовать трассировку стека, чтобы узнать, что (тип) должно было использоваться в вызове Combine и работать оттуда, например. чтобы узнать, как он был создан.

Как только вы его найдете, вы захотите, чтобы компоновщик сохранил его. Вы можете сделать это, добавив дополнительный, ненужный код (например, предложенный @Stuart). Мои собственные предложения являются:

  • использования [Preserve] атрибутов, когда у вас есть исходный код;

  • использовать XML file--xml=file), если у вас нет исходного кода;

Смежные вопросы