Сканирование DLL на наличие сборок .NET с определенным интерфейсом - некоторые DLL выдают R6034! - PullRequest
7 голосов
/ 18 февраля 2011

У меня есть программа, которая должна обнаруживать подключаемые библиотеки DLL на своем хосте.

Это достигается путем перечисления всех библиотек DLL в пределах (довольно большого) пути. Этот путь включает в себя множество вещей, в том числе собственные библиотеки DLL.

foreach (var f in Directory.EnumerateFiles(@"c:\Program Files", "*.dll", SearchOption.AllDirectories))
{
    try
    {
        var assembly = Assembly.LoadFile(f);
        var types = assembly.GetTypes();
        foreach (var type in types)
        {
            if (type.GetInterface("My.IInterface") != null)
            {
                plugins.Add(f);
                break;
            }
        }
        assembly = null;
    }
    catch (Exception e)
    {
    }
}

Если мой сканер обнаруживает библиотеку времени выполнения MS (например, msvcm80.dll), я получаю неуловимую ошибку времени выполнения R6034: «Приложение попыталось загрузить библиотеку времени выполнения C неправильно». Это окно блокирует выполнение программы. Я не хочу эту DLL (очевидно); есть ли способ вытащить изящную ошибку из этой ситуации?

[Относительно q: существует ли эффективный (например, не исключение) способ определения, является ли DLL сборкой .NET или нет, если эта DLL в настоящее время не загружена в пространство процесса?]

Ответы [ 2 ]

10 голосов
/ 18 февраля 2011

Сначала выполните нагрузку только на отражение с помощью Assembly.ReflectionOnlyLoadFrom.Только после того, как вы найдете плагин в сборке, вы должны загрузить его полностью с помощью Assembly.LoadFrom.

. Чтобы ответить на другой вопрос, вы можете проверить, имеет ли файл заголовок CLR.

См. Этот пост "Чтение заголовка CLR" на mpdotnet.framework

Вместе они позволят вам избежать любых исключений и сообщений об ошибках при поиске плагинов.

2 голосов
/ 18 февраля 2011

Не похоже на хорошую идею \ Program Files ... Может ли кто-нибудь поместить туда вредоносные библиотеки DLL?

Вы смотрели на использование MEF ? Это также может быть немного безопаснее.

Существует DirectoryCatalog, который будет автоматически загружать сборки для вас и возвращать вам массив вашего интерфейса.

Не уверен, знакомы ли вы с внедрением зависимостей или (IoC) инверсией управления, но вы также можете использовать MEF для этого.

Он включен в .Net 4.0.

...