アプリケーションの起動パスとは異なるパスでアプリケーションの設定ファイルを使用しようとしています。私は設定ファイル名を以下のように変更することができます:wcfが別の設定ファイルからロードされました
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", NewConfigFullFilename);
この後いくつかの方法が正しく動作します。 ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
は正しいファイルをロードし、他のメソッドは動作しません。 ConfigurationManager.GetSection("system.serviceModel/client")
はファイルからセクションをロードしません。
設定ファイルを使用してサービスまたはチャネルファクトリを作成する必要があるため、これが見つかりました。書き込み:
channelFactory = new ChannelFactory<TContract>(EndpointConfigurationName);
内部コードがGetSectionメソッドを使用していると思いますが、クラッシュしました。私はConfigurationManagerクラスのプライベートフィールドを調べ、ClientConfigPathsのインスタンスに_applicationCongiUriフィールドの古い設定ファイル名があり、静的なs_currentフィールドに正しいファイル名があることがわかりました。私はそうする他の方法があるかどうかを知りたいのですが今
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", NewConfigFullFilename);
FieldInfo field = typeof(ConfigurationManager).GetField("s_initLock", BindingFlags.Static | BindingFlags.NonPublic);
object lockobj = field.GetValue(null);
lock (lockobj)
{
typeof(ConfigurationManager).GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, 0);
}
field = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.Static | BindingFlags.NonPublic);
object s_configSystem = field.GetValue(null);
field = s_configSystem.GetType().GetField("_configHost", BindingFlags.Instance | BindingFlags.NonPublic);
object _configHost = field.GetValue(s_configSystem);
field = _configHost.GetType().GetField("_configPaths", BindingFlags.Instance | BindingFlags.NonPublic);
object _configPaths = field.GetValue(_configHost);
field = _configPaths.GetType().GetField("_applicationConfigUri", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(_configPaths, NewConfigFullFilename);
field = _configPaths.GetType().GetField("_localConfigFilename", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(_configPaths, NewConfigFullFilename);
:私は、新しい設定ファイルからサービスをロードし、正しく反映して2つのフィールドの値と、このwortkを変更するにはfoolowingコードを使用しましたまたはそれがAppDomain.CurrentDomain.SetData("APP_CONFIG_FILE"
で十分でないバグ、または他の提案がある場合。
おかげ