linker - template - mvvmcross xamarin forms
Problemas con xamarin.ios/monotouch, mvvmcross y enlaces (3)
¿Es posible omitir el enlace de algunas bibliotecas?
Sí. Puede aislar el problema (y estar 100% seguro de su origen) a su tercero utilizando la opción --linkskip=ASSEMBLY
(en argumentos adicionales de mtouch en las opciones de su proyecto). También se puede utilizar como una solución de lanzamiento (pero es mejor que encuentre una solución más precisa para obtener todos los beneficios del vinculador).
Por ejemplo , --linkskip=mscorlib
omitiría mscorlib.dll (es decir, sin extensión de archivo)
¿es posible ver cuál de esta stacktrace?
No exactamente. El problema no es con System.Delegate.Combine
. Dado que se llama en el seguimiento de la pila, sabrá que el enlazador no lo elimina.
OTOH uno de sus argumentos (un delegado) probablemente se elimine. Eso (lo más probable) puede suceder si se creó mediante la reflexión (ya que el vinculador usa análisis estático). Puede usar el seguimiento de la pila para ver qué (tipo) debería haberse utilizado en la llamada Combine
y trabajar hacia atrás desde allí, por ejemplo, para encontrar cómo se creó.
Una vez que lo encuentre, querrá que el enlazador lo conserve. Puede hacerlo agregando un código adicional innecesario (como sugirió @Stuart). Mis propias sugerencias son:
use los atributos
[Preserve]
cuando tenga el código fuente;use un archivo XML (y
--xml=file
) cuando no tenga el código fuente;
Tengo un problema irritante, si utilizo Ensambles Link SDK solo en xamarin studio recibo una excepción, si utilizo dont link la excepción no está sucediendo. He localizado el problema para ser parte de un dll de terceros que estoy usando (api para un servicio de transmisión de video). Creo que el enlazador está eliminando algunos de los métodos utilizados por este dll. ¿Es posible omitir el enlace de algunas bibliotecas y es posible ver cuál de esta stacktrace?
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
Cualquier ayuda es apreciada.
ACTUALIZACIÓN: según lo sugerido por stuart (gracias stuart), he agregado un archivo LinkerPleaseInclude con lo siguiente: Pero todavía recibe una excepción.
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();
}
}
Mi pensamiento era que tenía que ser algo relacionado con el 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]
Pero parece que no es el truco, ¿algún indicio para encontrar lo que se elimina?
No pude encontrar lo que faltaba, cuando el enlazador estaba haciendo su trabajo.
Sin embargo, encontré que durante una vinculación, la api de video estaba haciendo una llamada de sincronismo restsharp que hacía que la espera de enlace fuera completa y esto parecía causar el problema. Si cambié el flujo de trabajo y comencé una llamada asincrónica restsharp, que luego inicia el enlace cuando terminó, todo funcionó como un amuleto.
Muchas gracias por tu ayuda.
No puedo ayudar con la api de video sin nombre.
Pero para solucionar los problemas de vinculación de Mvvmcross:
Tendrá que averiguar en qué pagina / viewcontroller está ocurriendo el error del enlazador.
Luego, simplemente necesita agregar un archivo LinkerPleaseInclude.cs para engañar al enlazador y no eliminar el símbolo que está pelando.
Aquí hay un ejemplo: https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/DailyDilbert/DailyDilbert.Touch/LinkerPleaseInclude.cs