我正在努力让TinyIoC在Xamarin.iOS上工作,但我没有太多运气。我的项目链接器设置设置为“仅链接SDK程序集”。
我真的在做这么简单的事情:
public interface IPerson { int age { get; } }
public class Person : IPerson { public int age { get { return 99; } } }
然后我的注册码看起来像这样(我刚把它放在玩具应用中的AppDelegate中):
TinyIoCContainer.Current.Register<IPerson,Person>.AsMultiInstance();
当我尝试抓取一个IPerson时,我得到一个运行时异常,说IPerson无法解析(这个代码是在玩具应用程序的AppDelegate中注册代码之后立即找到的):
IPerson person = TinyIoCContainer.Current.Resolve<IPerson>();
这是错误:
Unable to resolve type: TinyTest.IPerson
但是,如果我将链接器设置更改为“不要链接”,一切正常。但这显然是站不住脚的,因为二进制文件变得非常庞大。
我尝试在IPerson界面和Person类上放置[Preserve]属性,但没有骰子。我也试过手动声明一个IPerson类型的变量并用一个新的Person()实例化它,然后抓住age属性,只是为了确保类型包含在构建中,但也没有运气。
感觉我在这里错过了什么 - 有人能指出我正确的方向吗?
谢谢!
答案 0 :(得分:2)
这是bug,因为反射用于调用内部Expression<TDelegate>
构造函数。
链接器无法分析反射使用情况(超出静态分析),因此必须了解那些特殊情况。
这显然是站不住脚的,因为二进制文件变得非常庞大。
继续使用默认链接SDK 选项,但在项目选项中添加--linkskip=System.Core
到其他mtouch参数, iOS Build 。
这样只有System.Core(来自SDK)不会被链接,并且大小的增加会小得多。当然,这只是一个解决方法,直到新版本正确解决问题。