2009-02-23 5 views
10

Dies begann als eine Möglichkeit, C++/CLI- und verwaltete C++ - Assemblys zu finden, sodass alle internen Klassen getestet werden konnten, um sicherzustellen, dass alle geerbten Methoden erneut implementiert wurden. Ich möchte dies als Build-Prozess-Schritt hinzufügen, um sicherzustellen, dass es nie wieder passiert.Kann festgestellt werden, in welcher Sprache eine .NET Assembly nachträglich geschrieben wurde?

Das Nachdenken über dieses Problem machte mich auch ein bisschen neugierig, da es interessant wäre, jede verwendete .NET Sprache zu bestimmen. Aus diesem Grund ging ich ein bisschen weiter und verglich Baugruppen aus allen .NET-Sprachen. Bis jetzt hier ist, was ich durch ein kleines Programm gefunden habe ich geschrieben, die die Art und Attributdaten aus jedem Satz von .NET-Assemblies über Reflexion vergleicht:

  • C# - Hat AssemblyConfigurationAttribute hat GuidAttribute
  • VB - Hat viele zusätzliche "My" -Typ (z. B. MyApplication, MySettings), hat GuidAttibute
  • F # - Hat eine FSharpInterfaceDataVersionAttribute, die auch die Version des verwendeten Compilers angibt.
  • C++ (alle außer/clr: sicher) - Hat eine Reihe von zusätzlichen Typen (FrameInfo, type_info)
  • C++/clr: sicher - Scheint keine einzigartigen Reflexionsmerkmale zu haben.

Es könnte sinnvoll sein, in dieser Reihenfolge zu analysieren:

  1. Es ist F #, wenn sie die FSharpInterfaceDataVersionAttribute
  2. Es ist C++ hat, wenn es ein in der riesigen Menge von zusätzlichen Typen habe ich gefunden.
  3. Es ist VB, wenn es die "My *" Typen hat.
  4. Es ist C#, wenn sie AssemblyConfigurationAttribute hat oder GuidAttribute
  5. Es ist wahrscheinlich, C++/clr sein: Sicher

Da dies jedoch eine schreckliche Hack ist, wollte ich hier einchecken, um sicherzustellen, dass es wasn Es ist keine andere Option verfügbar.

+0

Interessante Frage, aber warum die Verwendung von Latein? Retrospektiver wäre einfacher zu verstehen. Nicht jeder hier ist ein englischer Muttersprachler. – danio

+1

@danio: Weil Latein ist großartig? – bcat

Antwort

2

Wenn eine .NET-Sprache kompiliert wird, erhalten Sie nur IL. Mir ist keine standardisierte Methode bekannt, um zu bestimmen, welche spezifische Sprache die Assembly erstellt hat. Sie können eine bestehende Assembly und ilsasm (zerlegen) es in IL und sie ismem (zusammenbauen) zurück in eine praktisch identische Baugruppe.

Die Heuristiken, die Sie verwenden, sind eine sinnvolle und clevere Methode, um die Sprache zu identifizieren, die zum Erstellen der Baugruppe verwendet wird. Beachten Sie jedoch, dass sich diese Details zwischen den Compilerversionen der Sprachen ändern können.

3

Die Verweise auf Dinge wie die VB- oder F # -Klassenbibliotheken zu prüfen, scheint der wackeligste Weg zu sein, aber wie andere erwähnen, ist es eine Heuristik - genau wie es keine definitive Möglichkeit gibt zu sagen, welche Sprache eine native Binärdatei ist geschrieben in (aber Sie können fast 100% sicher sein durch Heuristik)

Verwandte Themen