DbProviderFactories.GetFactory(providerClass) не видит только что установленного провайдера
Если я установлю провайдера во время работы моего приложения. А затем вызовите DbProviderFactories.GetFactory(providerClass), чтобы проверить, установлен ли он, и я получаю исключение, вызывающее его. Но если я выйду из своего приложения и перезапущу его, он увидит его.
Что мне нужно вызвать, чтобы DbProviderFactories.GetFactory(providerClass) перечитал machine.config?
1 ответ
Решение
При первом использовании информация о поставщике считывается в таблицу статических данных, а затем всегда возвращается это значение до тех пор, пока приложение не будет перезапущено и эта таблица данных, конечно же, не будет заново создана.
Следующий код (впервые опубликованный в Windward Wrocks) очистит этот внутренний кеш и заставит перечитать:
/// <summary>
/// Force DbProviderFactories to re-read machine.config on the next call to
/// DbProviderFactories.GetFactoryClasses().
/// </summary>
static public void FlushDbProviderFactoriesCache()
{
try
{
FieldInfo initStateFieldInfo = typeof(DbProviderFactories).GetField("_initState",
BindingFlags.Static | BindingFlags.NonPublic);
if (initStateFieldInfo != null)
{
ConnectionState state = ConnectionState.Closed;
object initState = initStateFieldInfo.GetValue(state);
if (initState is ConnectionState)
{
state = (ConnectionState)initState;
if (state != ConnectionState.Closed)
initStateFieldInfo.SetValue(state, ConnectionState.Closed);
ConfigurationManager.RefreshSection("system.data");
}
}
}
catch (Exception)
{
// nada
}
}