Можно ли определить, на каком языке .NET Assembly была написана ex post facto? - PullRequest
10 голосов
/ 24 февраля 2009

Это началось как способ поиска сборок C ++ / CLI и Managed C ++, чтобы все внутренние классы можно было проверить, чтобы убедиться, что все унаследованные методы были переопределены. Я хотел бы добавить это в качестве шага процесса сборки, чтобы это никогда не повторилось.

Размышления об этой проблеме также вызвали у меня любопытство, так как было бы интересно определить любой используемый язык .NET. Из-за этого я пошел немного дальше и сравнил сборки из всех языков .NET. Итак, вот что я нашел в небольшой программе, которую я написал, которая сравнивает данные типов и атрибутов из любого набора сборок .NET с помощью рефлексии:

  • C # - Имеет AssemblyConfigurationAttribute, Имеет GuidAttribute
  • VB - имеет много дополнительных типов «Мой» (например, MyApplication, MySettings), имеет GuidAttibute
  • F # - Имеет атрибут FSharpInterfaceDataVersionAttribute, который также указывает версию используемого компилятора.
  • C ++ (все, кроме / clr: safe) - имеет множество дополнительных типов (FrameInfo, type_info)
  • C ++ / clr: safe - похоже, не имеет уникальных функций отражения.

Может быть разумно проанализировать в следующем порядке:

  1. Это F #, если он имеет атрибут FSharpInterfaceDataVersionAttribute
  2. Это C ++, если он есть в огромном наборе дополнительных типов, которые я нашел.
  3. Это VB, если у него есть типы "My *".
  4. Это C #, если он имеет AssemblyConfigurationAttribute или GuidAttribute
  5. Вероятно, это будет C ++ / clr: Safe

Однако, поскольку это ужасный взлом, я хотел проверить здесь, чтобы убедиться, что не было другого варианта.

Ответы [ 2 ]

3 голосов
/ 24 февраля 2009

Проверка ссылок на такие вещи, как библиотеки классов VB или F #, кажется наименее шатким способом сделать это, но, как другие отмечают, это эвристика - точно так же, как нет точного способа определить, на каком языке написан нативный двоичный код. в (но вы можете быть почти на 100% уверены по эвристике)

2 голосов
/ 24 февраля 2009

Когда компилируется язык .NET, все, что вы получаете - это IL. Я не знаю стандартного способа определения того, какой конкретный язык создал сборку. Вы можете взять существующую сборку и ildasm (разобрать) ее в IL, а затем ilasm (собрать) обратно в практически идентичную сборку.

Используемая вами эвристика является разумным и умным способом определения языка, используемого для создания сборки. Однако имейте в виду, что эти детали могут меняться в разных версиях языков компилятора.

...