Используйте BuildManager.GetType для просмотра сборок в WPF

У меня есть код для приложения ASP .NET, которое использует отражение для загрузки поставщиков данных. Я хотел бы повторно использовать этот код в приложении WPF, но похоже, что BuildManager.GetType просматривает только сборки верхнего уровня, если приложение не является ASP .NET. Кто-нибудь знает, как обойти это ограничение?

Следующий код создает исключение, говорящее о том, что DotNetNuke.Data.MySqlDataProvider не может быть найден в сборке System.Web. Сборка, содержащая класс DotNetNuke.Data.MySqlDataProvider, определенно существует в папке bin скомпилированного приложения WPF.

Dim objType Type = BuildManager.GetType("DotNetNuke.Data.MySqlDataProvider", True, True)

person Alex    schedule 25.03.2009    source источник


Ответы (2)


Попробуйте использовать AppDomain для поиска типа, например:

    private Type GlobalGetType(string typeName) 
    {
        Type t = null;

        foreach (Assembly ass in AppDomain.CurrentDomain.GetAssemblies()) 
        {
            Type assType = ass.GetType(typeName);

            if (t != null && assType != null)
                throw new ArgumentException("The specified type was found on different assemblies (\"" + t.Assembly.FullName + "\" and  \"" + ass.FullName + "\")");

            if (assType != null)
                t = assType;
        }

        return t;
    }

Он будет искать в каждой сборке приложения (включая сборки фреймворка). Я не знаю, есть ли способ узнать, является ли сборка сборкой верхнего уровня, ведь это бы оптимизировало поиск, но это все равно довольно быстро.

person Community    schedule 14.08.2009
comment
Это как раз то, что я искал в то время :) В итоге я сделал это по-другому, но я все равно дам вам ответ - person Alex; 15.08.2009

Решение AppDomain.CurrentDomain.GetAssemblies() допустимо только в том случае, если вас интересуют уже вызванные/введенные. В этом ответе Игорь объяснит это и представит пару обходных путей. Как найти тип, который еще не загружен в AppDomain?

person FlavioG    schedule 28.01.2021