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
    }
  }
Другие вопросы по тегам