Xamarin iOS 链接器问题
Xamarin iOS Linker Issue
我有一个应用程序有一个 android 和 ios 项目共享代码。 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 并在 Internet 上到处搜索,但没有任何结果。感谢任何帮助。
谢谢,
如果您在 iOS 项目上使用 "Link SDK assemblies only" 选项,那么所有这些 --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
{
...
}
我有一个应用程序有一个 android 和 ios 项目共享代码。 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 并在 Internet 上到处搜索,但没有任何结果。感谢任何帮助。
谢谢,
如果您在 iOS 项目上使用 "Link SDK assemblies only" 选项,那么所有这些 --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
{
...
}