我正在尝试在仅 Link SDK 模式下使用 MonoTouch 编译我的 iOS 应用程序。如果我完全关闭链接,它可以完全编译,但它也会生成一个不适合发布模式的巨大二进制文件。
不幸的是,我需要的库之一以某种方式调用了 Expression.Visit,并且我无法弄清楚如何指示链接器不将其删除。这会导致以下编译错误:
错误 MT2002:无法解析来自“System.Core,Version=2.0.5.0,Culture=neutral”的“System.Linq.Expressions.Expression System.Linq.Expressions.ExpressionVisitor::Visit(System.Linq.Expressions.Expression)”引用, PublicKeyToken=7cec85d7bea7798e" (MT2002) (MyApp)
As per 有关自定义链接的文档,我设置了一个链接器文件来尝试阻止这种情况发生:
<?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。