Ignoruj ​​brakujące zależności podczas ReflectionOnlyLoad

głosy
17

Pracuję w oknie przeglądarki proste klasy, która pozwala użytkownikom na otwieranie montaż i wybrać metodę statyczną od wewnątrz. Jednak istnieją pewne sytuacje, w których zależności zespole są brakujące.

Ponieważ muszę tylko nazwę metody, a nie jego pełną prototyp, czy jest jakiś sposób, aby ominąć FileNotFoundException że jest podniesione podczas wywoływania Assembly.ReflectionOnlyLoadFrom ? Ja obecnie obsługi AppDomain.ReflectionOnlyAssemblyResolve ale jeśli zwróci null następnie uzyskać FileLoadException z następującym komunikatem:

Nie można rozwiązać zależność do montażu „...”, ponieważ nie został fabrycznie. Podczas korzystania z API ReflectionOnly, zespoły zależne muszą być fabrycznie lub ładowane na żądanie poprzez imprezy ReflectionOnlyAssemblyResolve.

Wiem, że to musi być możliwe, ponieważ jakoś .NET Reflector pozwala pominąć nierozwiązanych zależności. Jednak zaczynam myśleć, że może Reflektor analizuje zespołów ręcznie zamiast załadowanie go do CLR i stosując standardowe odbicie. Być może coś takiego używa Cecil z projektu Mono.

Utwórz 27/08/2009 o 07:52
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
1

Wierzę, że reflektor ma swój własny montaż parsowania / załadunku - Spojrzałam na jego źródła, natomiast tył (przy użyciu samego Odbłyśnik: P) i zobaczył dużą liczbę zajęć związanych montażowych-, które wydają się być analizowany w masywnej strukturze drzewa.

zawsze można wysłać Red Gate / Rutz Loeder i poprosić o ostatecznym potwierdzeniem. :)

Odpowiedział 27/08/2009 o 08:27
źródło użytkownik

głosy
3

Chciałbym spróbować Cecil jeśli masz zamiar robić nietrywialne pracę z zespołami. Istnieje również MS CCI . (Nie jestem w 100% pewien jednej z tych prac z kawałkami brakuje, ale są na pewno dobre narzędzia w tym miejscu i byłbym zaskoczony, gdyby nie zrobił)

Jeśli naprawdę potrzebujesz, aby dostać się do metalu, nie można pokonać ten samouczek i próbkę Asmex , co powinno defintely albo prace lub pozwalają obejść.

Odpowiedział 27/08/2009 o 08:46
źródło użytkownik

głosy
3

Będzie to zignorować brakujące zależności:

        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);
        }
Odpowiedział 15/12/2011 o 23:08
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more