Xamarin / MonoTouch:由于缺少符号,因此无法在“仅Link SDK”模式下进行编译

史蒂夫·鲁库兹(Steve Rukuts)

我正在尝试在“仅链接SDK”模式下使用MonoTouch编译我的iOS应用程序。如果我完全关闭链接,它可以完全正常地编译,但是它还会生成一个不适合发布模式的巨大二进制文件。

不幸的是,我需要的一种库以某种方式调用Expression.Visit,我无法弄清楚如何指示链接器不要将其剥离。这导致此编译错误:

错误MT2002:无法解决“ System.Core,版本= 2.0.5.0,区域性=中性”引用中的“ System.Linq.Expressions.Expression System.Linq.Expressions.ExpressionVisitor :: Visit(System.Linq.Expressions.Expression)”引用,PublicKeyToken = 7cec85d7bea7798e“(MT2002)(MyApp)

根据有关自定义链接的文档,我已经设置了一个链接器文件以尝试阻止这种情况的发生:

<?xml version="1.0" encoding="UTF-8" ?>
<linker>
  <assembly fullname="System.Core">
    <type fullname="System.Linq.Expressions.ExpressionVisitor">
      <method signature="System.Linq.Expressions.Expression Visit(System.Linq.Expressions.Expression)" />
    </type>
  </assembly>
</linker>

不幸的是,这没有任何作用-错误只是像以前一样发生。

文档中提到了preserve="fields"我可以提供给参数<type>,因此我尝试了以下操作:

<?xml version="1.0" encoding="UTF-8" ?>
<linker>
  <assembly fullname="System.Core">
    <type fullname="System.Linq.Expressions.ExpressionVisitor" preserve="methods" />
  </assembly>
</linker>

那也不起作用。

然后,我在文件中引入了XML语法错误,并且构建失败,因为它无法解析链接器文件,因此我至少知道该文件正在读取。

但是后来我尝试在程序集名称中引入错误:

<?xml version="1.0" encoding="UTF-8" ?>
<linker>
  <assembly fullname="NonexistentAssembly">
  </assembly>
</linker>

导致错误,抱怨装配无法解决。

然后,我尝试修改类型名称:

<?xml version="1.0" encoding="UTF-8" ?>
<linker>
  <assembly fullname="System.Core">
    <type fullname="NonExistentType" preserve="methods" />
  </assembly>
</linker>

现在,它刚刚开始显示我之前看到的相同的“无法解析expressionvisitor :: visit”错误。似乎没有检查类型名称。

另外,签名名称都不是,因为这也呈现相同的编译错误。

<?xml version="1.0" encoding="UTF-8" ?>
<linker>
  <assembly fullname="System.Core">
    <type fullname="System.Linq.Expressions.ExpressionVisitor">
      <method signature="jg98j23890rj2390erk90fk3ew!]['##'#'[" />
    </type>
  </assembly>
</linker>

因此,似乎只要您指定程序集名称并具有有效的XML结构,链接器文件就不会引发任何异常。但是,链接器文件的文档对于这样一个复杂的主题不是特别冗长,并且包含许多语法错误,即:

<type fullname="Foo" preserve="fields" />
    <method name=".ctor" />
</type>

此外,它没有提供链接器文件格式的技术描述,因此我的定义完全有可能完全错误。

我也尝试过完全跳过System.Core的链接,--linkskip=System.Core但这没有任何效果。无论是否使用,我都尝试过此标志--xml

在MvvmCross项目中,我尝试指定一个新类来调用Visit方法,其样式与MvvmCross NuGet包添加到每个iOS项目的LinkerPleaseInclude.cs文件的样式相同:

[Preserve]
public class PleaseIncludeVisitor : ExpressionVisitor
{
    public PleaseIncludeVisitor()
    {
        this.Visit(null);
    }
}

不幸的是,这也没有效果。

我目前正在使用Mono 3.2.6((no / 9b58377)和Xamarin.iOS v7.0.7.2。

幸免

主要问题是无法在iOS上的运行时进行代码生成。

这意味着,有很大一部分System.Linq.Expressions ,通常情况下,是不可能在正常情况下提供(就像System.Refection.Emit不能提供)。

要解决此Xamarin.iOS,它已提供了一种替代实现(可以解释最常见的表达式)。

但是,当前代码不是与.NET框架100%兼容的API(已修复,但尚未发布)。例如

System.Linq.Expressions.Expression System.Linq.Expressions.ExpressionVisitor::Visit(System.Linq.Expressions.Expression)

以上内容void在当前的Xamarin.iOS(7.0.x)版本中返回。这就是链接器抱怨(这不是错误)的原因,因为它找不到该成员引用(如果找不到,则无法重新创建较小的链接的程序集)。无法保留不存在的成员(这就是为什么您尝试使用XML文件或属性将无济于事的原因)。

目前的解决办法是,以确认哪些组件使用这个API并重建(源文件)使用现有的System.Core.dll随机附带Xamarin.iOS。

笔记

我不知道如何指示链接器不要将其剥离。

链接器不会尝试将其删除,而是尝试将其保留(即,它必须加载引用才能将其保存回去)。但是,System.Core.dll由于无法提供程序集有效链接版本,因此无法找到该成员

<method signature="System.Linq.Expressions.Expression Visit(System.Linq.Expressions.Expression)" />

这就要求保留一些不存在的东西。它将被忽略,即,void找到-returning版本,它将与XML描述不匹配。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Xamarin / MonoTouch:由于缺少符号而无法在“仅Link SDK”模式下编译

来自分类Dev

无法在Ad-Hoc模式下编译iOS-App(Xamarin.iOS)

来自分类Dev

由于“缺少所需的图标文件”,因此无法分发Xamarin iOS iPad存档

来自分类Dev

SocketIOClient在发布模式下无法在Xamarin.Android上运行

来自分类Dev

Xamarin无法在Visual Studio 2015中进行编译

来自分类Dev

Xamarin 无法使用 Android 版本 7 进行编译

来自分类Dev

由于出现“找不到符号类X”错误,因此无法在Intellij Idea中编译Java类

来自分类Dev

爱普生 ePOS SDK for Android (Xamarin) 缺少常量

来自分类Dev

Xamarin.Forms无法编译Android Project

来自分类Dev

Xamarin Android应用在发布模式下崩溃(Parse.Android SDK)

来自分类Dev

Apache Giraph-由于一次仅执行1个任务,因此无法在主/工作者拆分模式下运行

来自分类Dev

Xamarin.Forms.Xaml.XamlParseException:找不到Trans:的MarkupExtension:在发布模式下使用PCL进行翻译

来自分类Dev

Xamarin WCF在发布模式下失败

来自分类Dev

xamarin ios 在设备模式下构建错误

来自分类Dev

由于 NETCore 和其他错误,Xamarin.Forms UWP 无法编译

来自分类Dev

使用MvvmCross在Xamarin中进行条件编译

来自分类Dev

Monotouch / Xamarin绑定继承

来自分类Dev

Xamarin / Monotouch中的AudioSessionSetProperty

来自分类Dev

仅调试构造函数,不在发布模式下编译

来自分类Dev

Visual Studio 2019中缺少Xamarin表单页面以进行添加

来自分类Dev

Xamarin Forms 5编译为android无法正常工作

来自分类Dev

预编译静态库在 xamarin ios 中无法正常工作

来自分类Dev

编译Xamarin iOS

来自分类Dev

Xamarin.IOS MonoTouch.Dialog ExpandableDatePickerElement无法正常工作

来自分类Dev

Xamarin iOS无法在构建过程中对装配进行AOT

来自分类Dev

Xamarin过期的Visual Studio无法打开项目进行查看

来自分类Dev

Xamarin iOS无法在构建过程中对装配进行AOT

来自分类Dev

Xamarin缺少参考

来自分类Dev

Xamarin.Android - 发布模式下的 MvxRecyclerView 错误

Related 相关文章

  1. 1

    Xamarin / MonoTouch:由于缺少符号而无法在“仅Link SDK”模式下编译

  2. 2

    无法在Ad-Hoc模式下编译iOS-App(Xamarin.iOS)

  3. 3

    由于“缺少所需的图标文件”,因此无法分发Xamarin iOS iPad存档

  4. 4

    SocketIOClient在发布模式下无法在Xamarin.Android上运行

  5. 5

    Xamarin无法在Visual Studio 2015中进行编译

  6. 6

    Xamarin 无法使用 Android 版本 7 进行编译

  7. 7

    由于出现“找不到符号类X”错误,因此无法在Intellij Idea中编译Java类

  8. 8

    爱普生 ePOS SDK for Android (Xamarin) 缺少常量

  9. 9

    Xamarin.Forms无法编译Android Project

  10. 10

    Xamarin Android应用在发布模式下崩溃(Parse.Android SDK)

  11. 11

    Apache Giraph-由于一次仅执行1个任务,因此无法在主/工作者拆分模式下运行

  12. 12

    Xamarin.Forms.Xaml.XamlParseException:找不到Trans:的MarkupExtension:在发布模式下使用PCL进行翻译

  13. 13

    Xamarin WCF在发布模式下失败

  14. 14

    xamarin ios 在设备模式下构建错误

  15. 15

    由于 NETCore 和其他错误,Xamarin.Forms UWP 无法编译

  16. 16

    使用MvvmCross在Xamarin中进行条件编译

  17. 17

    Monotouch / Xamarin绑定继承

  18. 18

    Xamarin / Monotouch中的AudioSessionSetProperty

  19. 19

    仅调试构造函数,不在发布模式下编译

  20. 20

    Visual Studio 2019中缺少Xamarin表单页面以进行添加

  21. 21

    Xamarin Forms 5编译为android无法正常工作

  22. 22

    预编译静态库在 xamarin ios 中无法正常工作

  23. 23

    编译Xamarin iOS

  24. 24

    Xamarin.IOS MonoTouch.Dialog ExpandableDatePickerElement无法正常工作

  25. 25

    Xamarin iOS无法在构建过程中对装配进行AOT

  26. 26

    Xamarin过期的Visual Studio无法打开项目进行查看

  27. 27

    Xamarin iOS无法在构建过程中对装配进行AOT

  28. 28

    Xamarin缺少参考

  29. 29

    Xamarin.Android - 发布模式下的 MvxRecyclerView 错误

热门标签

归档