Практическое руководство. Определение того, является ли файл сборкой
Файл является сборкой только в том случае, если он является управляемым и содержит запись сборки в своих метаданных. Дополнительные сведения о сборках и метаданных см. в разделе Манифест сборки.
Как вручную определить, является ли файл сборкой
Запустите Ildasm.exe (дизассемблер IL).
Загрузите файл, который нужно проверить.
Если программа ILDASM сообщает, что файл не является переносимым исполняемым файлом (PE), то он не является сборкой. Дополнительные сведения см. в разделе Практическое руководство. Просмотр содержимого сборки.
Как программно определить, является ли файл сборкой
С использованием класса AssemblyName
Вызовите метод AssemblyName.GetAssemblyName, указав полный путь к файлу и имя файла, который вы хотите проверить.
Если возникает исключение BadImageFormatException, значит файл не является сборкой.
Пример
Этот пример кода проверяет, является ли библиотека DLL сборкой.
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.
*/
}
Метод GetAssemblyName загружает тестовый файл и освобождает его после того, как информация будет прочитана.
С использованием класса PEReader
Установите NuGet пакет System.Reflection.Metadata.
Создайте экземпляр System.IO.FileStream для чтения данных из файла, который вы хотите проверить.
Создайте экземпляр System.Reflection.PortableExecutable.PEReader, передав созданный на предыдущем шаге файловый поток в его конструктор.
Проверьте значение свойства HasMetadata. Если оно равно
false
, файл не является сборкой.Вызовите метод GetMetadataReader на экземпляре
PEReader
для созданияMetadataReader
.Проверьте значение свойства IsAssembly. Если оно равно
true
, файл является сборкой.
В отличие от GetAssemblyName, класс PEReader не создает исключение при попытке чтения неуправляемых исполняемых файлов. Это позволяет избежать потерь производительности на генерацию исключений, если вам нужно проверять такие файлы. Исключения все равно нужно обрабатывать, на случай, если файл не существует или не является исполняемым файлом.
Этот пример кода показывает, является ли файл сборкой, используя PEReader.
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.
*/
}