2010-04-22 3 views
5

System.Reflection не поддерживает (AFAIK), отражающую глобальные методы в сборке. На уровне сборки я должен начинать с корневых типов.System.Reflection - глобальные методы недоступны для отражения

Мой компилятор может создавать сборки с глобальными методами, а моя стандартная загрузочная библиотека - это dll, которая включает в себя некоторые глобальные методы. Мой компилятор использует System.Reflection для импорта метаданных сборки во время компиляции. Кажется, если я буду зависеть от System.Reflection, глобальные методы не будут возможны. Самое чистое решение - преобразовать все мои стандартные методы в класс статические методы, но дело в том, что мой язык позволяет глобальные методы, и CLR поддерживает его, но System.Reflection оставляет пробел.

ildasm показывает глобальные методы просто отлично, но я полагаю, что он не использует System.Reflection и подходит к метаданным и байт-коду.

Помимо System.Reflection, кто-нибудь знает о любых других зеркальных или дизассемблирующих сторонних участниках, которые я мог бы использовать (предполагая, что в конечном итоге я выпущу свой компилятор как бесплатный, открытый с лицензией BSD с открытым исходным кодом).

РЕШЕННЫЙ: нет пробелов, за исключением, насколько мне известно. Спасибо, что указали GetModules, ребята!

ответ

9

Вы посмотрели Module.GetMethods?

Возвращает глобальные методы, определенные в модуле

Вы можете получить все модули вашей сборки с помощью Assembly.GetModules().

+0

Избили меня к нему, но я должен признать, что я на самом деле не пробовал. Хороший вопрос и хороший ответ. –

+1

@Brian: Почему вы думаете, что я пробовал? ;) –

+0

у вас, вероятно, есть власть на высоком уровне, которая сообщит вам, если документация точна или не просто посмотрела на нее :) –

4

Вы продолжаете избивать промежуток между CLR и System.Reflection, но на самом деле нет такой вещи, как глобальный метод или глобальное поле.

Это просто традиционные статические методы и статические поля, определенные определенным типом, с именем <Module>, который должен присутствовать в каждой допустимой сборке.

Как сказал Джон, вы можете использовать Module.GetMethod и Module.GetField оператору на членах типа.

Если вы хотите большего контроля, вы можете просто использовать Mono.Cecil.

+1

+1 Mono.Cecil отлично! –

+1

Я не «бьюсь ни о чем», кроме моей клавиатуры. Я просто пропустил эту информацию, поэтому я спросил об этом. Я узнаю больше каждый день. Спасибо за ответ. :) – codenheim

+0

@Jb: Что касается Mono.Cecil, и я знаю об этом и, конечно же, заинтересован в этом. Единственная причина, по которой я прошел, это лицензия. Когда я выпущу свой код, это будет лицензия BSD.Я буду поддерживать создание против Mono, но я не могу включить зависимость от любых инструментов, которые не являются обычными для официальных CLR и Mono. Конечно, все это спекулятивно сейчас. – codenheim

2

Обратите внимание, что Module.GetMethod() без параметров не возвратит все методы модуля.
Вместо этого используйте GetMethods (BindingFlags).

C++/CLI Пример:

#using <System.dll> 
using namespace System; 
using namespace System::Reflection; 
using namespace System::Diagnostics; 

bool has_main(array<MethodInfo^>^ methods) 
{ 
    for each(auto m in methods) 
     if(m->Name == "main") 
      return true; 
    return false; 
} 

int main() 
{ 
    auto module = Assembly::GetExecutingAssembly()->GetModules(false)[0]; 
    Debug::Assert(has_main(module->GetMethods()) == false); 
    Debug::Assert(has_main(module->GetMethods(BindingFlags::Static | BindingFlags::NonPublic))); 
} 
Смежные вопросы