Soru ReflectionOnlyLoad sırasında eksik bağımlılıkları yoksay


Kullanıcıların bir derleme açmasını ve içten statik bir yöntem seçmesini sağlayan basit bir sınıf tarayıcı iletişim kutusu üzerinde çalışıyorum. Ancak, meclisin bağımlılıklarının eksik olduğu bazı durumlar vardır.

Sadece tam olarak prototipini değil, yöntem adını kullanmam gerektiğinden, arama sırasında yükseltilen FileNotFoundException'ı geçmenin herhangi bir yolu var mı? Assembly.ReflectionOnlyLoadFrom? Şu anda idare ediyorum AppDomain.ReflectionOnlyAssemblyResolve ancak null döndürürseniz, aşağıdaki iletiyle bir FileLoadException alırsınız:

Önceden yüklenmemiş olduğu için '...' derlemesine bağımlılığı çözülemez. ReflectionOnly API'lerini kullanırken, bağımlı derlemeler önceden yüklenmeli veya ReflectionOnlyAssemblyResolve olayıyla isteğe bağlı olarak yüklenmelidir.

Bunun bir şekilde mümkün olabileceğini biliyorum çünkü .NET Reflektörü Çözülmemiş bağımlılıkları atlamanıza olanak tanır. Bununla birlikte, Reflektörün meclisleri CLR'ye yüklemek yerine standart yansımayı kullanarak elle ayrıştırdığını düşünmeye başladım. Belki de böyle bir şey kullanır Cecil Mono projesinden.


17
2017-08-27 06:52


Menşei


Reflector'un Cecil'i kullandığını sanmıyorum - bu ön tanımlıyor ve MS içinde geliyor. Ayrıca CCI kullanıyor olduğundan şüpheliyim. Methinks Lutz, bütün bu şeyleri yuvarlayabilen bir Allah'tır (yine de sonunda yoruldu!) - Ruben Bartelink


Cevaplar:


Denerdim Cecil Eğer montajları ile önemsiz bir iş yapacaksanız. Ayrıca var MS CCI. (Bunlardan hiçbiri eksik bitlerle% 100 emin değilim, ama bu alanda kesinlikle iyi araçlar var ve eğer yapmazlarsa şaşıracaktım)

Gerçekten metale gitmen gerekiyorsa, bunu yenemezsin. Asmex eğitimi ve örnek, ya çalışmalı ya da etrafında çalışmanıza izin vermeli.


3
2017-08-27 07:46



Bu Asmex öğreticisi çok ilginç görünüyor, bunu denemeliyim. - Nathan Baulch


Bu eksik bağımlılıklarınızı yok sayacaktır:

        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
            Assembly assembly = Assembly.ReflectionOnlyLoad("foo");
            foreach (Type t in assembly.GetTypes())
            {
                Console.WriteLine(t.FullName);
            }
        }

        static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
        {
            return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
        }

3
2017-12-15 22:08



Bu benim için çalışmadı. Hala eksik bağımlılıkları arar. - Jonn


Reflektörün kendi montaj ayrıştırma / yükleme yaptığını düşünüyorum - kaynağına bir süre önce baktım (Reflektör'ün kendisini kullanarak: p) ve büyük bir ağaç yapısına ayrıştırılmış gibi görünen çok sayıda montaj ile ilgili ders gördüm.

Red Gate / Rutz Loeder'e her zaman e-posta gönderebilir ve kesin onay isteyebilirsin. :)


1
2017-08-27 07:27