Freigeben über


Vorgehensweise: Ermitteln, ob eine Datei eine Assembly ist

Eine Datei ist eine Assembly, wenn sie verwaltet wird, und enthält einen Assemblyeintrag in den Metadaten. Weitere Informationen zu Assemblys und Metadaten finden Sie unter Assemblymanifest.

Manuelles Ermitteln, ob eine Datei eine Assembly ist

  1. Starten Sie das ToolIldasm.exe (IL Disassembler).

  2. Laden Sie die Datei, die Sie testen möchten.

  3. Wenn ILDASM meldet, dass es sich bei der Datei nicht um eine portable ausführbare Datei (PE) handelt, handelt es sich nicht um eine Assembly. Weitere Informationen finden Sie im Thema Anleitung: Anzeigen von Assembly-Inhalten.

Programmgesteuertes Ermitteln, ob es sich bei einer Datei um eine Assembly handelt

Verwenden der AssemblyName-Klasse

  1. Rufen Sie die AssemblyName.GetAssemblyName Methode auf, und übergeben Sie den vollständigen Dateipfad und den Namen der Datei, die Sie testen.

  2. Wenn eine BadImageFormatException Ausnahme ausgelöst wird, ist die Datei keine Assembly.

In diesem Beispiel wird eine DLL getestet, um festzustellen, ob es sich um eine Assembly handelt.

using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

static class ExampleAssemblyName
{
    public static void CheckAssembly()
    {
        try
        {
            string path = Path.Combine(
                RuntimeEnvironment.GetRuntimeDirectory(),
                "System.Net.dll");

            AssemblyName testAssembly = AssemblyName.GetAssemblyName(path);
            Console.WriteLine("Yes, the file is an assembly.");
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("The file cannot be found.");
        }
        catch (BadImageFormatException)
        {
            Console.WriteLine("The file is not an assembly.");
        }
        catch (FileLoadException)
        {
            Console.WriteLine("The assembly has already been loaded.");
        }
    }

    /* Output: 
    Yes, the file is an assembly.  
    */
}
Imports System
Imports System.IO
Imports System.Reflection
Imports System.Runtime.InteropServices

Module ExampleAssemblyName
    Sub CheckAssembly()
        Try
            Dim filePath As String = Path.Combine(
                RuntimeEnvironment.GetRuntimeDirectory(),
                "System.Net.dll")

            Dim testAssembly As AssemblyName =
                                AssemblyName.GetAssemblyName(filePath)
            Console.WriteLine("Yes, the file is an Assembly.")
        Catch ex As FileNotFoundException
            Console.WriteLine("The file cannot be found.")
        Catch ex As BadImageFormatException
            Console.WriteLine("The file is not an Assembly.")
        Catch ex As FileLoadException
            Console.WriteLine("The Assembly has already been loaded.")
        End Try
    End Sub
End Module
' Output:  
' Yes, the file is an Assembly.  

Die GetAssemblyName Methode lädt die Testdatei und gibt sie dann wieder frei, sobald die Informationen gelesen wurden.

Verwenden der PEReader-Klasse

Vorsicht

PEReader und die System.Reflection.Metadata Bibliothek ist nicht für die Verarbeitung nicht vertrauenswürdiger Eingaben ausgelegt. Fehlerhafte oder böswillige PE-Dateien können zu unerwartetem Verhalten führen, einschließlich nicht gebundener Speicherzugriff, Abstürze oder Blockaden. Verwenden Sie diese APIs nur mit vertrauenswürdigen Assemblys.

  1. Wenn Sie auf .NET Standard oder .NET Framework abzielen, installieren Sie das NuGet-Paket "System.Reflection.Metadata ". (Bei der Zielbestimmung von .NET Core oder .NET 5+ ist dieser Schritt nicht erforderlich, da diese Bibliothek im freigegebenen Framework enthalten ist.)

  2. Erstellen Sie eine System.IO.FileStream Instanz zum Lesen von Daten aus der Datei, die Sie testen.

  3. Erstellen Sie eine System.Reflection.PortableExecutable.PEReader Instanz, und übergeben Sie den Dateidatenstrom an den Konstruktor.

  4. Überprüfen Sie den Wert der HasMetadata Eigenschaft. Wenn der Wert lautet false, ist die Datei keine Assembly.

  5. Rufen Sie die Methode GetMetadataReader auf der PE-Reader-Instanz auf, um einen Metadatenleser zu erstellen.

  6. Überprüfen Sie den Wert der IsAssembly Eigenschaft. Wenn der Wert lautet, ist truedie Datei eine Assembly.

Im Gegensatz zur GetAssemblyName Methode löst die PEReader Klasse keine Ausnahme für native portable ausführbare Dateien (PORTABLE Executable, PE) aus. Auf diese Weise können Sie die zusätzlichen Leistungskosten vermeiden, die durch Ausnahmen verursacht werden, wenn Sie solche Dateien überprüfen müssen. Sie müssen weiterhin Ausnahmen behandeln, falls die Datei nicht vorhanden ist oder keine PE-Datei ist.

In diesem Beispiel wird gezeigt, wie Sie ermitteln können, ob eine Datei eine Assembly mit der PEReader Klasse ist.

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using System.Runtime.InteropServices;

static class ExamplePeReader
{
    static bool IsAssembly(string path)
    {
        using var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

        // Try to read CLI metadata from the PE file.
        using var peReader = new PEReader(fs);

        if (!peReader.HasMetadata)
        {
            return false; // File does not have CLI metadata.
        }

        // Check that file has an assembly manifest.
        MetadataReader reader = peReader.GetMetadataReader();
        return reader.IsAssembly;
    }

    public static void CheckAssembly()
    {
        string path = Path.Combine(
                RuntimeEnvironment.GetRuntimeDirectory(),
                "System.Net.dll");

        try
        {
            if (IsAssembly(path))
            {
                Console.WriteLine("Yes, the file is an assembly.");
            }
            else
            {
                Console.WriteLine("The file is not an assembly.");
            }
        }
        catch (BadImageFormatException)
        {
            Console.WriteLine("The file is not an executable.");
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("The file cannot be found.");
        }
    }

    /* Output: 
    Yes, the file is an assembly.  
    */
}
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Reflection.Metadata
Imports System.Reflection.PortableExecutable
Imports System.Runtime.InteropServices

Module ExamplePeReader
    Function IsAssembly(path As String) As Boolean

        Dim fs As FileStream = New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

        ' Try to read CLI metadata from the PE file.
        Dim peReader As PEReader = New PEReader(fs)
        Using (peReader)
            If Not peReader.HasMetadata Then
                Return False ' File does Not have CLI metadata.
            End If

            ' Check that file has an assembly manifest.
            Dim reader As MetadataReader = peReader.GetMetadataReader()
            Return reader.IsAssembly
        End Using
    End Function

    Sub CheckAssembly()
        Dim filePath As String = Path.Combine(
                RuntimeEnvironment.GetRuntimeDirectory(),
                "System.Net.dll")

        Try
            If IsAssembly(filePath) Then
                Console.WriteLine("Yes, the file is an assembly.")
            Else
                Console.WriteLine("The file is not an assembly.")
            End If
        Catch ex As BadImageFormatException
            Console.WriteLine("The file is not an executable.")
        Catch ex As FileNotFoundException
            Console.WriteLine("The file cannot be found.")
        End Try
    End Sub
End Module
' Output:  
' Yes, the file is an Assembly.

Siehe auch