Come scoprire quale versione di .NET Framework è necessario eseguire un eseguibile?

Ho un file eseguibile e mi piacerebbe sapere quali versioni del framework .NET questo file deve essere avviato.

C’è un modo semplice per trovare queste informazioni da qualche parte?

(Finora ho provato ILDASM e DUMPBIN senza fortuna.)

Penso che il più vicino che puoi ottenere in modo affidabile sia determinare quale versione del CLR è richiesta. È ansible farlo utilizzando ILDASM e guardando il nodo “MANIFEST” o Reflector e guardando la vista dissasembly del nodo “Application.exe” come IL. In entrambi i casi c’è un commento che indica la versione CLR. In ILDASM, il commento è “// versione Metadata” e in Reflector il commento è “Versione runtime di destinazione”.

Ecco alcuni esempi di un’applicazione .NET WinForm denominata WindowsFormsApplication1.exe:

ILDASM:

// Metadata version: v2.0.50727 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 2:0:0:0 } .assembly extern System { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 2:0:0:0 } 

Riflettore:

 .module WindowsFormsApplication1.exe .subsystem 0x0002 // MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8} // Target Runtime Version: v2.0.50727 

È inoltre ansible consultare l’elenco degli assembly di riferimento e cercare il riferimento con il numero di versione più alto.

Di nuovo, usando ILDASM guardando i dati del nodo “MANIFEST”:

 .assembly extern System.Drawing { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: .ver 2:0:0:0 } .assembly extern System.Core { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 3:5:0:0 } 

E usando Reflector, guardando il dissambiabile (ancora come IL) per ogni riferimento elencato:

 .assembly extern System.Core { .ver 3:5:0:0 .publickeytoken = (B7 7A 5C 56 19 34 E0 89) } 

Trovando il riferimento con i metadati della versione più elevata è ansible determinare la versione del framework di riferimento da cui proviene, il che indicherebbe che è necessaria la stessa versione del Framework installato per l’esecuzione dell’applicazione. Detto questo, non lo considererei affidabile al 100%, ma non credo che cambierà presto.

Utilizzo del Blocco note , vecchio di tre decenni, con dimensioni di 200 kb, strumento preinstallato:

  • apri l’applicazione con notepad appname.exe ,
  • cerca parola “quadro”,
  • ripetere l’ultima ricerca con F3 fino a quando non .NET Framework,version=vX.Y
  • se non si trova nulla (versioni inferiori a 3.0), cercare la v2. … ancora 100 volte più facile che installare gigabyte di strumenti di analisi di dot net e garbage studios.

Qualsiasi altro editor / visualizzatore può aprire anche i binari, come Notepad ++ o il grande visualizzatore di testo / hex viewer di totalCommander .

Un approccio più semplice sarebbe usare dotPeek e vedere cosa si presenta nell’albero.

Vedi il pannello delle proprietà: inserisci la descrizione dell'immagine qui

È ora ansible utilizzare ILSpy per esaminare il framework di destinazione di un assieme. Dopo aver caricato l’assembly, fare clic sulla radice del nodo assembly e trovare le informazioni nella dichiarazione TargetFramework:

 [assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")] 

Dal codice è ansible utilizzare Assembly.ImageRuntimeVersion ma guardando il file probabilmente la cosa migliore da fare sarebbe utilizzare Reflector e vedere a quale versione di mscorlib viene fatto riferimento.

Modifica: Ancora meglio sarebbe usare ildasm , aprire l’assembly e quindi visualizzare il manifest per l’assembly. La prima riga del manifest ti indicherà la versione esatta di CLR per cui è stato creato l’assembly.

È ansible utilizzare uno strumento denominato CorFlags.exe. È in giro da .NET 2.0 e so per certo che è incluso in Windows SDK 7.0. Per impostazione predefinita (su Windows XP Pro) è installato su C: \ Programmi \ Microsoft SDK \ Windows \ v7.0A \ bin \ CorFlags.exe. Forniscilo con il percorso del file a un modulo gestito (senza altri flag della riga di comando) per visualizzare le informazioni dell’intestazione, che include la versione.

Tieni presente che questa utility è progettata per modificare l’intestazione PE32 di un modulo, quindi non utilizzare nessuno dei flag finché non leggi attentamente la documentazione .

Dalla riga di comando: find "Framework" MyApp.exe

O puoi solo scoprire quale riferimento di System.Core ha. Questo ti dirà la versione di .NET Framework che questa app sta utilizzando. Per 2.0 la versione di System.Core sarà 2.0.xxx.xxx. Per 3.5 la versione sarà 3.5.xxx.xxx, ecc.

Su Linux / OSX / unix puoi usare:

 strings that_app.exe | grep 'v2.\|Framework'