У меня есть код для приложения 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)
Ответ 1 · Community
Попробуйте использовать 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;
}
Он будет искать в каждой сборке приложения (включая сборки фреймворка). Я не знаю, есть ли способ узнать, является ли сборка сборкой верхнего уровня, ведь это бы оптимизировало поиск, но это все равно довольно быстро.