我有一个恼人的问题,如果我只在xamarin工作室使用Link SDK Assemblies我得到一个例外,如果我使用不链接,则不会发生异常。我已经将问题定位为我正在使用的第三方dll的一部分(api用于视频流服务)。我相信链接器正在剥离这个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
感谢任何帮助。
更新: 正如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();
}
}
我的想法是它必须是与堆栈跟踪相关的东西
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 :(得分:5)
是否可以跳过某些图书馆的链接
是。您可以使用--linkskip=ASSEMBLY
选项(在项目选项中的其他mtouch参数中)将问题(并且100%确定其来源)与第三方隔离开来。它也可以用作发布解决方法(但您最好找到更精确的解决方案,以便从链接器中获得全部好处)。
E.g。 --linkskip=mscorlib
会跳过mscorlib.dll(即没有文件扩展名)
是否有可能从这个堆栈跟踪中看到哪个?
不完全。问题不在System.Delegate.Combine
。由于它在堆栈跟踪中命名,因此您知道它不会被链接器删除。
OTOH其中一个论点(代表)很可能被删除。如果它是使用反射创建的(因为链接器使用静态分析),那么(很可能)会发生这种情况。您可以使用堆栈跟踪来查看Combine
调用中应该使用的内容(类型),并从那里开始向后工作,例如找到它的创建方式。
一旦找到它,你就会希望链接器保留它。您可以通过添加额外的,不需要的代码(如@Stuart建议)来实现。我自己的建议是:
拥有源代码时使用[Preserve]
属性;
如果您没有源代码,请使用XML file(和--xml=file
);
答案 1 :(得分:4)
无法协助未命名的视频API。
但要解决Mvvmcross链接问题:
您需要确定链接器错误发生在哪个页面/视图控制器上。
然后你只需要添加一个LinkerPleaseInclude.cs文件来欺骗链接器不删除它正在剥离的任何符号
答案 2 :(得分:1)
当链接器正在执行其工作时,我无法找到丢失的内容。
但是我发现在一次绑定期间,视频api正在进行同步的restsharp调用,这使得绑定等待完成,这似乎导致了问题。如果我改变了工作流程并启动了异步restsharp调用,然后在完成时启动绑定,那么这一切都可以作为一个魅力。
非常感谢你的帮助。