まず、Xamarinが「リンカ」と呼ぶものは、実際には「デッドコードリムーバ」です。それはuncallableコードがコンパイルされたアプリケーションにそれを作るのを防ぐために仮定されます。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();
}
}
}
更新:すべてのキャストを取り除いても問題は解決しませんでした。私は多くの場所でスーパークラスオブジェクトの仮想メンバを呼び出しています。それは私の次の推測ですが、それが問題ならば、修正は面倒です。
は、カスタムリンクの説明を指定しようとしたことがありXamarinのドキュメント? https://developer.xamarin.com/guides/cross-platform/advanced/custom_linking/ –
いいえ、私はそこに行かなければならないかもしれませんが、まず何が起こっているのか理解したいと思います。 –
リンカは非常にシンプルで(強力な)設計であり、私はJsonのシリアライゼーション、クロスアセンブリのクラス/メンバの削除などを処理するカスタムステップを書いています...コードを見たり、テストケースで実行したりすると、次のようなことができます。https://github.com/mono/linker/tree/master/linker – SushiHangover