significado retrospectivo qué paradigmas metodologia metodo investigación investigacion facto expost expofacto estudio diseño caracteristicas .net clr c++-cli managed managed-c++

.net - retrospectivo - paradigmas de la investigacion ex post facto



¿Es posible determinar en qué idioma se escribió una Asamblea.NET ex post facto? (2)

Esto comenzó como una forma de encontrar C ++ / CLI y ensamblados C ++ administrados 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.

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 ahora, esto es lo que he encontrado a través de un pequeño programa que escribí que compara el tipo y los datos de atributos de cualquier conjunto de ensambles .NET a través de la reflexión:

  • C # - Tiene AssemblyConfigurationAttribute, tiene GuidAttribute
  • VB: tiene muchos tipos adicionales de "Mi" (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: seguro - Parece que no tiene características de reflexión únicas.

Puede ser razonable analizar en este orden:

  1. Es F # si tiene el FSharpInterfaceDataVersionAttribute
  2. Es C ++ si tiene alguno en el gran conjunto de tipos extra 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: seguro

Sin embargo, como este es un truco horrible, quería verificar aquí para asegurarme de que no había otra opción disponible.


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


Cuando se compila un lenguaje .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.