2009-12-22 10 views

risposta

5

Eseguire lo strumento PEVerify contro la vostra assemblea.

PEVerify.exe viene installato insieme a Visual Studio, ad es.questo viene con Visual Studio 2012:

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\PEVerify.exe

+0

Una volta eseguita questa utility, come si può sapere se si tratta di un codice gestito in modo puramente formale? Ho appena ricevuto: "Tutte le classi e i metodi in verificati". –

+1

@DanW: allora va tutto bene. Avrai errori altrimenti. Se invocato da uno script o un altro programma, è possibile verificare un codice di uscita diverso da zero che indica errori. Puoi testare questo usando la parola chiave "non sicura" in C#. –

0

Dovrò ricontrollare questo ma sono abbastanza sicuro che lo si può scoprire con Reflector di redgate.

+1

non sembra essere una buona idea? - è un sacco di lavoro per scavare tutti i metodi di un assieme – ironic

+0

Come non posso trova qualsiasi cosa in Reflector 5.1.6.0 in merito a questo –

0

assemblee ILMerge fonde solo gestite, here, per citare dalla loro pagina di download, 'ILMerge è un'utility per la fusione più assembly .NET in un unico assembly .NET'.

Non ho visto un assembly gestito unito a un binario nativo. Tecnicamente, potresti farli unire di per sé, includendo il binario non gestito come una risorsa incorporata, ma il caricamento della risorsa incorporata in memoria come codice binario - non l'ho mai visto prima. Ho provato questa tecnica usando le mappe della memoria ma non ci sono riuscito.

L'altro modo di controllare è cercare nel file binario stesso, se ha la 15a voce nella directory dei dati, ed è diverso da zero quindi è un binario .NET, i binari nativi non hanno questo. Vedi here dove ho postato questa risposta a una domanda simile.

Spero che questo aiuti, Cordiali saluti, Tom.

0

Penso che dovresti usare .NET reflection per analizzare tutti i tipi e metodi in assembly.

3

Run ildasm da un Visual Studio Command Prompt come segue:

ildasm file.exe/intestazioni/noil/testo

Verso la fine dell'output si vedrà il seguente:

// ----- CLR Intestazione:
dimensioni // Intestazione: ...
// Maggiore runtime Versi su: ...
// versione runtime minore: ...
// ...
// Flags: 0x00000000

Se Flags ha impostato il bit più basso (per esempio 0x00000001) quindi l'assembly è puro CLR; in caso contrario (ad esempio 0x00000000), l'assembly è in modalità mista. Nota che potrebbero essere presenti altri flag, quindi è solo il bit più basso a cui sei interessato (quindi se l'ultima cifra è 1, 3, 5, 7, 9, b, dof, allora è puro CLR).

(Edit: È anche possibile eseguire ildasm graficamente, aprire il file eseguibile in questione e scegliere intestazioni dal menu Visualizza per visualizzare le stesse informazioni.)

+3

Non un afaik slam-dunk, la compilation C++/CLI er/linker non imposta questo bit a destra, anche se si compila con/clr: pure. Corflags.exe mostra anche questo. –

9

Come suggerito da nobugz, un modo più semplice per vedere le bandiere CLR è utilizzando l'utilità corflags, che fa parte del SDK .NET 2.0.

Se non vengono specificate le opzioni, vengono visualizzate le bandiere per l'immagine data:

C:\>corflags Foo.dll 
Version : v2.0.50727 
CLR Header: 2.5 
PE  : PE32 
CorFlags : 9 
ILONLY : 1 
32BIT  : 0 
Signed : 1 

Il "ILONLY" bit indica se si tratta di una pura assemby gestito, o un'assemblea mista.

Si noti che il commento dell'utente 'nobugz' suggerisce che questi flag non sono garantiti per essere corretti, quindi questo metodo potrebbe non essere infallibile.

0

per ottenere il flag PE da C#, utilizzare l'API System.Reflection: http://www.example8.com/category/view/id/6027

...

Assembly a = Assembly.GetExecutingAssembly(); 
Module m = a.ManifestModule; 

PortableExecutableKinds peKinds; 
ImageFileMachine imageFileMachine; 
m.GetPEKind(out peKinds, out imageFileMachine); 

if ((peKinds & PortableExecutableKinds.ILOnly) != 0) 

...

1

Migliorare sulla risposta fornita sopra Wim ..

  1. Individua il tuo "PEVerify.exe" - ce l'hai se hai installato VS.- CO PY IL PERCORSO COMPLETO PER IL file PEVerify.exe, il percorso sarà diverso - - Ecco un esempio: C: \ Programmi (x86) \ Microsoft SDK \ Windows \ v8.0A \ bin \ NETFX 4.0 Strumenti \ PEVerify.exe

  2. Aperto Studio Command prompt Visuale (non "Esegui come amministratore")

  3. Digitare: cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools

  4. prompt dei comandi dovrebbe ora essere in questo lungo testo invece di C: \ o qualcosa .... punterà al percorso di dove si trova PEVerify.exe.

  5. Ora digitate: peverify "your full path to your dll you want to check - quindi premere Invio - Ecco il mio esempio: PEverify "G: \ TestFolder \ My_Managed_OR_Unmanaged.dll"

  6. Dopo aver premuto Invio e si ottiene un messaggio come di seguito, la sua 100 % gestito dll -. tutte le Classi e metodi My_Managed_OR_Unmanaged.dll Verificati"