System.reflection - Глобальные методы не доступны для размышлений

StackOverflow https://stackoverflow.com/questions/2694706

  •  01-10-2019
  •  | 
  •  

Вопрос

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

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

ildasm показывает глобальные методы просто нормально, но я предполагаю, что он не использует саму систему. Рафлекцию и идет направо на метаданные и Bytecode.

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

Решено: нет разрыва, кроме моих знаний. Спасибо за то, что указываете GetModules, ребята!

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Обратите внимание, что 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)));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top