Xamarin iOS 链接器问题

Posted

技术标签:

【中文标题】Xamarin iOS 链接器问题【英文标题】:Xamarin iOS Linker Issue 【发布时间】:2019-04-30 11:41:11 【问题描述】:

我有一个应用程序,该应用程序有一个带有共享代码的 androidios 项目。 android 应用程序完美运行并使用 SDK Only 链接器。我还有一个链接器文件来强制链接器不删除使用的函数 - 这是一个相当大的文件,我也尝试添加一堆保留属性。在 iOS 项目中同样的情况,但是,做同样的事情是行不通的。它从 EF 中删除某些内容并引发此异常:

"The type initializer for 'Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions' threw an exception. ---> System.InvalidOperationException"

整个代码库在没有链接的情况下工作得很好。我添加了一堆 mtouch 参数来尝试跳过它,但这也不起作用。

--linkskip=Microsoft.EntityFrameworkCore 
--linkskip=Microsoft.EntityFrameworkCore.Design 
--linkskip=Microsoft.EntityFrameworkCore.Sqlite 
--linkskip=Microsoft.EntityFrameworkCore.Tools 
--linkskip=Interactive.Async 
--linkskip=Remotion.Linq 
--linkskip=System.Data 
--linkskip=System.Collections.Immutable 
--linkskip=System.Diagnostics.DiagnosticSource 
--linkskip=Microsoft.Extensions.Logging 
--linkskip=System.Interactive.Async 
--linkskip=Microsoft.EntityFrameworkCore.Abstractions 
--linkskip=Microsoft.Extensions.DependencyInjection 
--linkskip=Microsoft.Extensions.Caching.Memory 
--linkskip=System.ComponentModel.Annotations

我将在 NuGet 存储库中添加每个 DLL,这将使链接器无用。这是 iOS 链接器的错误还是我在这里遗漏了什么?我已阅读文档https://docs.microsoft.com/en-us/xamarin/ios/deploy-test/linker?tabs=windows 并在互联网上到处搜索,但没有任何结果。任何帮助表示赞赏。

谢谢,

【问题讨论】:

【参考方案1】:

如果您在 iOS 项目中使用“仅链接 SDK 程序集”选项,那么所有这些 --linkskip 参数都不会做任何事情,因为只有 SDK 程序集被链接。因此,EntityFrameworkCore 可能正在使用 Xamarin.iOS SDK 程序集中的链接。 System.Linq 是 SDK 的一部分,为许多数据库类型添加了扩展方法。

所以我认为您可能遇到了这个问题:https://github.com/xamarin/xamarin-macios/issues/3394

如果是这样,请尝试放置:

[assembly: Preserve (typeof (System.Linq.Queryable), AllMembers = true)]

在命名空间外的iOS项目的Main.cs文件中,例如:

using UIKit;

[assembly: Preserve (typeof (System.Linq.Queryable), AllMembers = true)]
namespace

    ...

【讨论】:

如果这不起作用,请检查here。

以上是关于Xamarin iOS 链接器问题的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin iOS Autolayout:自动调整各种设备的宽度和垂直滚动,同时保持水平滚动禁用演示链接

Xamarin 热重载不工作。目前我正在使用iOS模拟器

Xamarin.forms中的垂直滑块?

领域数据库报告“No RealmObjects。链接器是否剥离了它们?“在Windows10上

由于 HEALTHKIT 参考,Xamarin.ios 构建被拒绝

由于 HEALTHKIT 参考,Xamarin.ios 构建被拒绝