2009-09-29 10 views
12

Podczas generowania IL użyciu DynamicMethod to możliwe, aby zadzwonić do metod i pól dostępu, które w przeciwnym razie byłyby un-dostępne, jeśli podasz „true” dla parametru restrictedSkipVisibility w DynamicMethod constructorCzy można pominąć sprawdzanie widoczności podczas generowania dynamicznego IL za pomocą metody MethodBuilder?

wolałbym emitują dynamiczny IL w dynamicznym zespole zamiast tego mogę zapisać wygenerowany il do złożenia w czasie kompilacji. Jeśli używam tej metody, muszę użyć metody MethodBuilder zamiast DynamicMethod. Jednak muszę mieć możliwość pominięcia kontroli widoczności, więc nie otrzymuję MethodAccessException po uruchomieniu mojego kodu dynamicznego. Czy istnieje sposób, aby to zrobić, a jeśli tak, to w jaki sposób?

+0

Czy ten problem został rozwiązany? Czy możesz krótko opisać, jak to rozwiązałeś? – kizzx2

+0

Nie. O ile wiem, nie można go rozwiązać. Skończyło się na innym podejściu do rozwiązania, używając biblioteki Mono.Cecil do ponownego napisania zespołu. W ten sposób mogłem uzyskać dostęp do prywatnych lub wewnętrznych członków bez naruszania zasad bezpieczeństwa typu. Jednak dzięki tej metodzie nie byłem w stanie poprawnie dopasować symboli do plików źródłowych, co spowodowało inne kłopoty. –

Odpowiedz

2

Podczas korzystania z MethodBuilder w zespoły dynamiczne, są przypisane te same reguły, co kompilacje generowane złożeń. Widoczność między podzespołami jest regulowana przez:

Należy zapoznać się z dokumentacją i próbkami, aby sprawdzić, czy odpowiada ona Twoim potrzebom.

0

Jeśli potrzebujesz zmaterializować wygenerowany kod przez interfejs zamiast delegata, to będzie użyteczne, aby pomijać metodę sprawdzania zgodności dla konstruktora metod. Nie znalazłem sposobu, aby zrobić to bezpośrednio, ale możesz łatwo wywołać DynamicMethod w swoim MethodBuilderze za pomocą EmitCalli (OpCodes.Calli ...).