アプリの実行中にプロバイダーをインストールした場合。次に、DbProviderFactories.GetFactory(providerClass)を呼び出して、インストールされているかどうかを確認します。これを呼び出すと、例外が発生します。しかし、アプリを終了して再起動すると、アプリが表示されます。
DbProviderFactories.GetFactory(providerClass)を取得してmachine.configを再読み取りするには、何を呼び出す必要がありますか?
アプリの実行中にプロバイダーをインストールした場合。次に、DbProviderFactories.GetFactory(providerClass)を呼び出して、インストールされているかどうかを確認します。これを呼び出すと、例外が発生します。しかし、アプリを終了して再起動すると、アプリが表示されます。
DbProviderFactories.GetFactory(providerClass)を取得してmachine.configを再読み取りするには、何を呼び出す必要がありますか?
プロバイダー情報は、最初に使用されたときに静的データテーブルに読み込まれ、アプリケーションが再起動してそのデータテーブルが再作成されるまで、常にその値が返されます。
次のコード(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
}
}