【问题标题】:TinyIoC, Xamarin.iOS, linker settingsTinyIoC、Xamarin.iOS、链接器设置
【发布时间】:2013-09-19 17:30:11
【问题描述】:

我正在尝试让 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 类型的变量并使用 new Person() 对其进行实例化,然后获取 age 属性,以确保该类型已包含在构建中,但也没有运气。

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

谢谢!

【问题讨论】:

    标签: ios dependency-injection xamarin.ios tinyioc


    【解决方案1】:

    这是一个bug,因为反射用于调用内部Expression&lt;TDelegate&gt; 构造函数。

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

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

    继续使用默认的 Link SDK 选项,但将 --linkskip=System.Core 添加到 Additional mtouch arguments,在 Project Options 中,iOS 构建

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

    【讨论】:

    • 上面的语法是正确的,因为如果在 mtouch 参数中写这个,我仍然无法解决问题。
    • 不确定我是否正确解析了您的评论。无论如何,此问题在 XI 7.0 发布之前已解决 - 因此任何最新版本的 Xamarin.iOS 都不需要此解决方法。
    • 我在询问“linkskip”语法是否正确,因为我将它用于另一个库。
    • 是的(正确),但您的错误可能不同。它是否适用于 Don't link ?如果是这样,请提交错误报告@bugzilla.xamarin.com 以及一个独立的测试用例,我们会看看。
    • 我来这里是为了寻找与 AutoFac 类似的问题,但遇到了一个不同的错误,@poupou 的答案也已修复。有趣的是;我不必在 MonoTouch 中跳过链接 System.Core,但需要在 MonoDroid 中这样做(我使用 Link SDK 在两个平台上运行相同的代码)。所以要为其他人提供 googlebot:我在 System.Linq.Expressions.Expression.CreateLambda 得到了一个带有内部 System.NullReferenceExceptionAutofac.Core.DependencyResolutionException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多