【问题标题】:Xamarin.iOS linker and reflection issueXamarin.iOS 链接器和反射问题
【发布时间】:2020-12-28 15:10:00
【问题描述】:

在我的 Xamarin.iOS 项目中,我需要减小程序集大小(Apple 对 AppStore 应用程序的要求),并且我需要打开链接器,将链接器行为设置为“仅链接框架 SDK”或“链接所有”。

当我在链接器行为中选择“仅链接框架 SDK”时,我在构建项目时收到编译错误:

无法解析引用“System.Void System.Data.SqlClient.SqlCommandBuilder::DeriveParameters(System.Data.SqlClient.SqlCommand)”, 从方法“System.Void DevExpress.Xpo.DB.MSSqlConnectionProvider::CommandBuilderDeriveParameters(System.Data.IDbCommand)”引用 在“System.Data.SqlClient,版本=4.4.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”中。

为了解决这个问题,我发现建议在链接器行为选项中打开“全部链接”选项。

当我选择“全部链接”时,项目编译正常,但在运行时我在 IoC 容器代码上遇到系统异常(类型 AAA 未实现接口 BBB),因为我使用反射,并且带有“Link All”选项的链接器会影响带有反射的代码。据我所知,不建议在使用反射的项目中使用此链接器选项(Link All)。

此时我有什么选择?

【问题讨论】:

    标签: xamarin xamarin.forms xamarin.ios


    【解决方案1】:

    链接器配置

    我怀疑你最好的选择是定义一个配置文件来告诉链接器必须保留什么。 Microsofts documentation site 上有一组很好的文档。

    还有一些其他选项,但可能不严格适用于这种情况,或者您可能希望使用组合。

    保留属性

    您可以为链接器提供额外的定义,以确保不会从您的应用程序中删除类型、方法和/或字段。在您自己的代码中,首选方法是使用 [Preserve] 自定义属性,如 Linking on iOSLinking on Android 指南中所述。

    每个平台的链接当然是可能的,但是我怀疑你想在你的共享项目中保留一些东西,这就是为什么我认为配置文件适合你。

    这种方法使您能够在不同的级别进行定义(例如,程序集或类级别以保留所有内容或单个属性/方法等)。

    实际引用需要保留的位

    我非常不喜欢这个选项,但有些人发现证明您可以保留部分代码或只是接受它是一个解决方案可以快速轻松地进行。

    您实际上创建了一个对您想要保留的方法/属性的实际引用的类。

    public class LinkerPleaseInclude
    {
        public void Include(MyType arg)
        {
            arg.MethodIDontWantRemoved();
        }
    }
    

    注意我从this site获取了一些细节

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 2013-11-02
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多