TinyIoC、Xamarin.iOS、链接器设置

eve*_*hen 5 dependency-injection xamarin.ios ios tinyioc

我正在尝试让 TinyIoC 在 Xamarin.iOS 上运行,但运气不太好。我的项目链接器设置设置为“仅链接 SDK 程序集”。

我实际上正在做这么简单的事情:

public interface IPerson { int age { get; } }
public class Person : IPerson { public int age { get { return 99; } } }
Run Code Online (Sandbox Code Playgroud)

然后我的注册代码如下所示(我刚刚将其放在玩具应用程序的 AppDelegate 中):

TinyIoCContainer.Current.Register<IPerson,Person>.AsMultiInstance();
Run Code Online (Sandbox Code Playgroud)

当我尝试获取 IPerson 时,出现运行时异常,指出 IPerson 无法解析(此代码可在玩具应用程序的 AppDelegate 中的注册代码之后立即找到):

IPerson person = TinyIoCContainer.Current.Resolve<IPerson>();
Run Code Online (Sandbox Code Playgroud)

这是错误:

Unable to resolve type: TinyTest.IPerson
Run Code Online (Sandbox Code Playgroud)

但是,如果我将链接器设置更改为“不链接”,则一切正常。但这显然是站不住脚的,因为二进制文件变得非常巨大。

我尝试将 [Preserve] 属性放在 IPerson 接口和 Person 类上,但没有成功。我还尝试手动声明 IPerson 类型的变量并使用 new Person() 实例化它,然后获取 Age 属性,只是为了确保该类型包含在构建中,但也没有运气。

感觉我在这里错过了一些东西 - 有人能指出我正确的方向吗?

谢谢你!

pou*_*pou 2

这是一个错误,因为反射用于调用内部Expression<TDelegate>构造函数。

链接器无法分析反射用法(它超出静态分析范围),因此它必须了解这些特殊情况。

但这显然是站不住脚的,因为二进制文件变得非常巨大。

继续使用默认的Link SDK选项,但将附加 mtouch 参数--linkskip=System.Core添加到项目选项iOS构建中。

这样,只有 System.Core(来自 SDK)不会被链接,并且大小的增加会小得多。当然,这只是一个解决方法,直到新版本正确解决该问题为止。