Во-первых, общее замечание, что Xamarin называет своим «компоновщиком», на самом деле является скорее «удалением мертвого кода». Предполагается, что некачественный код может превратиться в компилируемое приложение.Xamarin linker удаляет все конструкторы, но сохраняет методы экземпляра?
У меня есть тип в моем приложении. Когда я использую отражение, чтобы получить его конструкторы, я вижу нулевые конструкторов:
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();
}
}
}
ОБНОВЛЕНИЕ: избавление от всех бросков не решило проблему. Я нахожу виртуальных членов объектов суперкласса во многих местах; это моя следующая догадка, но если это проблема, исправление будет беспорядочным.
Вы пытались задать описание пользовательских ссылок? https://developer.xamarin.com/guides/cross-platform/advanced/custom_linking/ –
Нет, мне, возможно, придется туда поехать, но я хочу понять, что происходит в первую очередь. –
Компилятор довольно прост (и мощный) в дизайне, я написал пользовательские шаги для обработки сериализации Json, удаления/удаления класса сборки и т. Д. ...Рассмотрение кода и/или запуск его в тестовых случаях может помочь вам: https://github.com/mono/linker/tree/master/linker – SushiHangover