首先,一般注意,Xamarin 所谓的“链接器”实际上更像是“死代码删除器”。它应该防止不可调用的代码进入已编译的应用程序。
我的应用程序中有一个类型。当我使用反射来获取它的构造函数时,我看到零构造函数:
private static int GetConstructorCount(Type type) {
ConstructorInfo[] constructors = type.GetConstructors();
return constructors.Count();
}
然而,当我使用反射查看它的实例成员时,我看到了很多:
private static void LogMemberInfo(Type type) {
int constructorCount = GetConstructorCount(type);
MyLoggingMethod(constructorCount, "Constructors");
MemberInfo[] members = type.GetMembers();
List<string> willLog = new List<string>();
foreach(MemberInfo member in members) {
if (member.DeclaringType == type) {
willLog.Add(member.Name);
}
}
willLog.Sort();
foreach (string str in willLog) {
MyLoggingMethod.LogLine(str);
}
}
上面的输出是:
0 Constructors
lots of surviving members, including instance members
这是一个问题,因为该类型是通往许多其他类型的门户。我希望通过摆脱所有构造函数,所有实例成员都会消失。他们没有。
这是链接器中的错误吗?或者它是否仍然不想摆脱实例成员?
我确实通过强制转换访问该类型的成员。也许这就是问题所在?
public class MySuperclass {
public static MySuperclass Instance {get; set;}
}
public MyClass: MySuperclass {
public static SomeMethod() {
MySuperclass object = MySuperclass.Instance;
MyClass castObject = object as MyClass; // castObject will always be null, as no constructors survived the linking process. But maybe the linker doesn't realize that?
if (castObject!=null) {
castObject.InstanceMethod();
}
}
}
更新:摆脱所有演员并没有解决问题。我在很多地方都在调用超类对象的虚拟成员;这是我的下一个猜测,但如果这是问题所在,修复将是一团糟。