Mono.Cecil: вызов метода базового класса из другой сборки - PullRequest
3 голосов
/ 04 февраля 2011

Как я могу получить MethodReference к методу базового класса по имени?

Я пробовал

type.BaseType.Resolve().Methods;

и если я добавлю dll, содержащую базовый класс, в ассемблер разрешения, он вернет методы. Но если я добавлю вызов, используя

MSILWorker.Create(OpCodes.Call, baseMethod);

(где baseMethod был найден путем использования методов из разрешенного TypeDefinition) полученный IL не читается, даже Reflector зависает и закрывается.

Теперь немного ИЛ:
если вызывается закрытый метод для типа:

 call instance void SomeNamespace.MyClass::RaisePropertyChanged(string)

если вызывается защищенный метод для базового типа:

call instance void [OtherAssembly]BaseNamespace.BaseClass::RaisePropertyChanged(string)

Так, как я могу произвести последнее, используя Mono.Cecil?

1 Ответ

5 голосов
/ 04 февраля 2011

Как вы уже догадались, вам нужно получить правильную область MethodReference для модуля.Так что если у вас есть:

TypeDefinition type = ...;
TypeDefintion baseType = type.BaseType.Resolve ();
MethodDefinition baseMethod = baseType.Methods.First (m => ...);

, то baseType и baseMethod являются определениями из другого модуля.Вам необходимо импортировать ссылку на baseMethod перед ее использованием:

MethodReference baseMethodReference = type.Module.Import (baseMethod);
il.Emit (OpCodes.Call, baseMethodReference);
...