2009-02-23 19 views
10

Esto comenzó como una forma de encontrar C++/CLI y ensamblados administrados de C++ para que todas las clases internas a ellos pudieran ser probadas para asegurar que todos los métodos heredados fueran reimplementados. Me gustaría agregar esto como un paso del proceso de compilación para garantizar que nunca vuelva a suceder.¿Es posible determinar en qué idioma se escribió un ensamblado .NET ex post facto?

Pensar en este problema también me hizo un poco curioso, ya que sería interesante poder determinar cualquier lenguaje .NET utilizado. Debido a esto, fui un poco más allá y comparé ensamblados de todos los lenguajes de .NET. Hasta el momento esto es lo que he encontrado a través de un pequeño programa que escribí que se compara el tipo de atributos y datos de cualquier conjunto de ensamblados .NET a través de la reflexión:

  • C# - Tiene AssemblyConfigurationAttribute, Tiene GuidAttribute
  • VB - Tiene muchos "Mi" tipo extra (por ejemplo MyApplication, MySettings), tiene GuidAttibute
  • F # - Tiene un FSharpInterfaceDataVersionAttribute que también especifica la versión del compilador utilizado.
  • C++ (all but/clr: safe) - Tiene un montón de tipos adicionales (FrameInfo, type_info)
  • C++/clr: safe - Parece que no tiene características de reflexión únicas.

podría ser razonable para analizar en este orden:

  1. Es F # si tiene el FSharpInterfaceDataVersionAttribute
  2. Es C++ si tiene alguna en el enorme conjunto de tipos adicionales que encontré.
  3. Es VB si tiene los tipos "Mi *".
  4. Es C# si tiene AssemblyConfigurationAttribute o GuidAttribute
  5. Es probable que sea C++/CLR: Segura

Sin embargo, como este es un horrible truco, quería comprobar aquí para asegurarse de que no wasn es otra opción disponible.

+0

Pregunta interesante, pero ¿por qué el uso del latín? Retrospectivamente sería más fácil de entender. No todos aquí son hablantes nativos de inglés. – danio

+1

@danio: Porque el latín es increíble? – bcat

Respuesta

2

Cuando se compila un idioma .NET, todo lo que obtiene es IL. No conozco una forma estándar de determinar qué lenguaje específico creó el conjunto. Puede tomar un conjunto existente e ildasm (desmontarlo) en IL y ilasm (ensamblarlo) de nuevo en un ensamblaje virtualmente idéntico.

La heurística que utiliza es una forma razonable e inteligente de identificar el lenguaje utilizado para crear el conjunto. Sin embargo, tenga en cuenta que estos detalles pueden cambiar entre las versiones de los compiladores de los idiomas.

3

Verificar las referencias de bibliotecas de clases VB o F # parece ser la forma menos inestable de hacerlo, pero como otros mencionan, es una heurística, al igual que no hay una forma definitiva de decir qué idioma es un binario nativo escrito en (pero puede estar casi 100% seguro por heurística)

Cuestiones relacionadas