2009-02-23 5 views
10

Questo è iniziato come un modo per trovare gli assembly C++/CLI e Managed C++ in modo che tutte le classi interne a loro possano essere testate per garantire che tutti i metodi ereditati siano stati reimplementati. Vorrei aggiungere questo come una fase del processo di costruzione per garantire che non accada mai più.È possibile determinare in quale lingua un assembly .NET è stato scritto ex post facto?

Pensare a questo problema mi ha anche reso un po 'curioso in quanto sarebbe interessante poter determinare qualsiasi linguaggio .NET utilizzato. Per questo motivo, sono andato un po 'oltre e ho confrontato gli assembly di tutti i linguaggi .NET. Finora qui è quello che ho trovato attraverso un piccolo programma che ho scritto che mette a confronto il tipo e attribuire i dati da qualsiasi insieme di assembly .NET attraverso la riflessione:

  • C# - Ha AssemblyConfigurationAttribute, HA GuidAttribute
  • VB - Ha molti "My" extra (ad esempio MyApplication, MySettings), ha GuidAttibute
  • F # - Ha un FSharpInterfaceDataVersionAttribute che specifica anche la versione del compilatore utilizzato.
  • C++ (tutto tranne/clr: sicuro) - Ha un sacco di tipi extra (FrameInfo, type_info)
  • C++/clr: sicuro - Sembra non avere caratteristiche di riflessione univoche.

Potrebbe essere ragionevole per analizzare in questo ordine:

  1. E 'F # se ha la FSharpInterfaceDataVersionAttribute
  2. E' C++ se ne ha l'enorme insieme di tipi in più ho trovato.
  3. È VB se ha i "My *" Tipi.
  4. E 'C# se ha AssemblyConfigurationAttribute o GuidAttribute
  5. E' probabile che sia C++/CLR: Sicuro

Tuttavia, poiché si tratta di un orribile hack, ho voluto verificare in qui per assicurarsi che non ci wasn 't un'altra opzione disponibile.

+0

Interessante domanda, ma perché usare il latino? Retrospettivamente sarebbe più facile da capire. Non tutti qui sono di madrelingua inglese. – danio

+1

@danio: Perché il latino è fantastico? – bcat

risposta

2

Quando viene compilato un linguaggio .NET, tutto ciò che ottieni è IL. Non sono a conoscenza di un modo standard per determinare quale linguaggio specifico ha creato l'assembly. Puoi prendere un assemblaggio esistente e ildasm (smontarlo) in IL e poi ilasmarlo (assemblarlo) in un assemblaggio praticamente identico.

L'euristica utilizzata è un modo ragionevole e intelligente per identificare la lingua utilizzata per creare l'assembly. Tuttavia, tieni presente che questi dettagli potrebbero cambiare tra le versioni del compilatore delle lingue.

3

Controllare i riferimenti per cose come le librerie di classi VB o F # sembra essere il modo meno traballante per farlo, ma come altri menzionano, è un euristico - proprio come non esiste un modo definitivo per dire in quale lingua un binario nativo è scritto (ma puoi essere sicuro al 100% con euristica)