Nie jestem nawet pewien, czy jest to możliwe, więc przepraszam, jeśli nie. Przeszukałem dość obszernie i nie znalazłem tego, czego szukam.Przesłanianie metody w DLL przy użyciu refleksji
Zasadniczo mamy aplikację wyprodukowaną przez osobę trzecią, która, aby być całkowicie bezceremonialnym, jest śmieciem. Mamy konkretny problem i udało się namierzyć problem za pomocą ILSpy do metody w bibliotece DLL. Oczywiście nie mamy (ani nie możemy uzyskać) kodu źródłowego, a dana firma nie chce naprawić problemu w rozsądnych ramach czasowych.
Tak więc, zbadaliśmy różne drogi dochodzenia i nie wymyślimy niczego. Dążyłem do sprawdzenia, czy można tego dokonać za pomocą refleksji i jest to ostatnia nadzieja na to, aby to zadziałało. W skrócie, co chciałbym zrobić to:
- Tworzenie prostych bibliotekę klas o takiej samej nazwie jak istniejący DLL
- użycie odbicie importować metod z istniejącej biblioteki DLL
- Jakoś nadpisuję tę metodę własnym, poprawnym kodem
- Odbuduj kod, więc mam nową bibliotekę DLL, zawierającą 99% funkcjonalności istniejącej biblioteki DLL, ale z moim kodem nadpisywania zapewniającym poprawną funkcjonalność.
Znalazłem podczas moich badań TypeBuilder.DefineMethodOverride oraz stronę ze StackOverflow, która wydaje się podobna, ale nie do końca tego, czego szukam.
http://msdn.microsoft.com/en-us/library/system.reflection.emit.typebuilder.definemethodoverride.aspx
Is there a way to "override" a method with reflection?
Wszelkie porady mile widziane!
Andrew
Edit
innych możliwych I ma pomysł był aby wytworzyć częściową klasę zawierającą funkcję sterowania ręcznego, ale to nie wydaje się wykonalne albo.
Zastanawiasz się, czy działa tu podejście oparte na przechwytywaniu - coś takiego jak Castle DynamicProxy: http://www.castleproject.org/projects/dynamicproxy/ - oczywiście nie zastąpiłbyś całkowicie metody wywołania metody, ale z pewnością możesz przechwycić/uchwyt błędu i poprawianie (o tak, i to zależy od tego, czy klasa ma metody wirtualne). – Charleh
Dlaczego po prostu nie stworzysz klasy, jak powiedziałeś, która wywołuje klasę strony trzeciej dla większości rzeczy z wyjątkiem metody, którą chcesz zastąpić? Lub wyprowadzić z tej klasy i użyć innej nazwy dla tej metody? Też naprawdę potrzebujesz, aby być wewnątrz 1 unikalnej biblioteki DLL? Dlaczego nie podzielić go na 2? – ppetrov