2009-02-23 8 views
10

Rozpoczęło się to od znalezienia złożeń C++/CLI i Managed C++, aby wszystkie klasy wewnętrzne mogły zostać przetestowane, aby zapewnić, że wszystkie odziedziczone metody zostały ponownie zaimplementowane. Chciałbym dodać to jako etap procesu kompilacji, aby upewnić się, że nigdy się to nie powtórzy.Czy można ustalić, w jakim języku Zgromadzenie .NET zostało napisane ex post facto?

Pomyśl o tym problemie również mnie trochę zaciekawił, ponieważ byłoby interesujące móc określić dowolny język .NET. Z tego powodu poszedłem trochę dalej i porównałem zespoły ze wszystkich języków .NET. Dotychczas oto co znalazłem dzięki małym programem pisałem który porównuje typ i danych z dowolnego zestawu zespołów .NET atrybutu poprzez refleksji:

  • C# - Czy AssemblyConfigurationAttribute, Ma GuidAttribute
  • VB - Ma wiele dodatkowych "My" (np. MyApplication, MySettings), ma GuidAttibute
  • F # - Posiada FSharpInterfaceDataVersionAttribute, która również określa wersję używanego kompilatora.
  • C++ (wszystkie oprócz/clr: safe) - Zawiera kilka dodatkowych typów (FrameInfo, type_info)
  • C++/clr: safe - Wydaje się, że nie ma żadnych unikatowych funkcji odbicia.

To może być uzasadnione analizować w tej kolejności:

  1. To F # jeśli to ma FSharpInterfaceDataVersionAttribute
  2. Jest C++, jeśli ma każdy w ogromnym zestawem dodatkowych typów znalazłem.
  3. To VB, jeśli ma typy "My *".
  4. Jest to C#, jeśli ma AssemblyConfigurationAttribute lub GuidAttribute
  5. To może być C++/clr: Bezpieczny

Jednakże, jak to jest okropny hack, chciałem sprawdzić się, aby upewnić się, że nie był dostępna jest inna opcja.

+0

Interesujące pytanie, ale dlaczego korzystanie z łaciny? Retrospektywnie byłoby łatwiej zrozumieć. Nie każdy tutaj jest native speakerem języka angielskiego. – danio

+1

@danio: Bo łacina jest niesamowita? – bcat

Odpowiedz

2

Po skompilowaniu języka .NET otrzymujesz tylko IL. Nie jestem świadomy standardowego sposobu określania, który konkretny język tworzył zestaw. Możesz wziąć istniejący montaż i ildazm (zdemontować) go do IL, a następnie ilastować (zmontować) z powrotem w praktycznie identyczny zestaw.

Użyte heurystyki są rozsądnym i sprytnym sposobem identyfikacji języka używanego do tworzenia zespołu. Należy jednak pamiętać, że te szczegóły mogą się zmieniać między wersjami językowymi kompilatora.

3

Sprawdzanie referencji dla takich rzeczy jak biblioteki klasy VB lub F # wydaje się być najmniej chwiejnym sposobem na zrobienie tego, ale jak wspominają inni, jest to heurystyka - tak jak nie ma definitywnego sposobu na określenie, który język jest natywnym binarnym napisane (ale możesz być prawie w 100% pewny przez heurystyki)

Powiązane problemy