370 Stimmen

Wie kann ich feststellen, ob eine .NET-Assembly für x86 oder x64 erstellt wurde?

Ich habe eine willkürliche Liste von .NET-Assemblies.

Ich muss programmatisch prüfen, ob jede DLL für x86 (im Gegensatz zu x64 oder Any CPU) erstellt wurde. Ist dies möglich?

9voto

Ludwo Punkte 5883

Versuchen Sie, CorFlagsReader zu verwenden von diesem Projekt bei CodePlex . Sie enthält keine Verweise auf andere Baugruppen und kann so verwendet werden, wie sie ist.

5voto

Morgan Mellor Punkte 61
[TestMethod]
public void EnsureKWLLibrariesAreAll64Bit()
{
    var assemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Where(x => x.FullName.StartsWith("YourCommonProjectName")).ToArray();
    foreach (var assembly in assemblies)
    {
        var myAssemblyName = AssemblyName.GetAssemblyName(assembly.FullName.Split(',')[0] + ".dll");
        Assert.AreEqual(ProcessorArchitecture.MSIL, myAssemblyName.ProcessorArchitecture);
    }
}

5voto

Eric Lease Punkte 4024

Nachfolgend finden Sie eine Batch-Datei, die Folgendes ausführt corflags.exe gegen alle dlls y exes im aktuellen Arbeitsverzeichnis und allen Unterverzeichnissen, analysieren die Ergebnisse und zeigen die Zielarchitektur jedes einzelnen an.

Je nach Version von corflags.exe verwendet wird, enthalten die Einzelposten in der Ausgabe entweder 32BIT , または 32BITREQ (und 32BITPREF ). Welches dieser beiden Elemente in der Ausgabe enthalten ist, ist der kritische Posten, der geprüft werden muss, um zu unterscheiden zwischen Any CPU y x86 . Wenn Sie eine ältere Version von corflags.exe (vor Windows SDK v8.0A), dann wird nur die 32BIT Einzelposten in der Ausgabe vorhanden sein wird, wie andere in früheren Antworten angegeben haben. Andernfalls 32BITREQ y 32BITPREF ersetzen.

Dies setzt voraus corflags.exe ist in der %PATH% . Der einfachste Weg, dies zu gewährleisten, ist die Verwendung eines Developer Command Prompt . Alternativ können Sie die Datei auch von ihrem Standardspeicherort .

Wenn die unten stehende Batch-Datei auf einem nicht verwalteten dll o exe wird es fälschlicherweise als x86 da die tatsächliche Leistung von Corflags.exe wird eine Fehlermeldung ähnlich der folgenden erscheinen:

corflags : Fehler CF008 : Die angegebene Datei hat keinen gültigen verwalteten Header

@echo off

echo.
echo Target architecture for all exes and dlls:
echo.

REM For each exe and dll in this directory and all subdirectories...
for %%a in (.exe, .dll) do forfiles /s /m *%%a /c "cmd /c echo @relpath" > testfiles.txt

for /f %%b in (testfiles.txt) do (
    REM Dump corflags results to a text file
    corflags /nologo %%b > corflagsdeets.txt

   REM Parse the corflags results to look for key markers   
   findstr /C:"PE32+">nul .\corflagsdeets.txt && (      
      REM `PE32+` indicates x64
        echo %%~b = x64
    ) || (
      REM pre-v8 Windows SDK listed only "32BIT" line item, 
      REM newer versions list "32BITREQ" and "32BITPREF" line items
        findstr /C:"32BITREQ  : 0">nul /C:"32BIT     : 0" .\corflagsdeets.txt && (
            REM `PE32` and NOT 32bit required indicates Any CPU
            echo %%~b = Any CPU
        ) || (
            REM `PE32` and 32bit required indicates x86
            echo %%~b = x86
        )
    )

    del corflagsdeets.txt
)

del testfiles.txt
echo.

4voto

thalm Punkte 2589

Ich habe ein superpraktisches Tool geklont, das einen Kontextmenüeintrag für Assemblies im Windows-Explorer hinzufügt, um alle verfügbaren Informationen anzuzeigen:

Hier herunterladen: https://github.com/tebjan/AssemblyInformation/releases

enter image description here

2voto

Wernfried Domscheit Punkte 45772

Eine fortgeschrittene Anwendung dafür finden Sie hier: CodePlex - ApiChange

Beispiele:

C:\Downloads\ApiChange>ApiChange.exe -CorFlags c:\Windows\winhlp32.exe
File Name; Type; Size; Processor; IL Only; Signed
winhlp32.exe; Unmanaged; 296960; X86

C:\Downloads\ApiChange>ApiChange.exe -CorFlags c:\Windows\HelpPane.exe
File Name; Type; Size; Processor; IL Only; Signed
HelpPane.exe; Unmanaged; 733696; Amd64

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X