diff --git a/src/libraries/System.Configuration.ConfigurationManager/src/Resources/System.Configuration.ConfigurationManager.rd.xml b/src/libraries/System.Configuration.ConfigurationManager/src/Resources/System.Configuration.ConfigurationManager.rd.xml index 987a31bbb6d..fdf637c8564 100644 --- a/src/libraries/System.Configuration.ConfigurationManager/src/Resources/System.Configuration.ConfigurationManager.rd.xml +++ b/src/libraries/System.Configuration.ConfigurationManager/src/Resources/System.Configuration.ConfigurationManager.rd.xml @@ -5,6 +5,8 @@ + + diff --git a/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ImplicitMachineConfigHost.cs b/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ImplicitMachineConfigHost.cs index 16db5162ac1..6edbe4d2489 100644 --- a/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ImplicitMachineConfigHost.cs +++ b/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ImplicitMachineConfigHost.cs @@ -23,14 +23,14 @@ namespace System.Configuration out string locationConfigPath, IInternalConfigRoot configRoot, params object[] hostInitConfigurationParams) { // Stash the filemap so we can see if the machine config was explicitly specified - _fileMap = (ConfigurationFileMap)hostInitConfigurationParams[0]; + _fileMap = hostInitConfigurationParams[0] as ConfigurationFileMap; base.InitForConfiguration(ref locationSubPath, out configPath, out locationConfigPath, configRoot, hostInitConfigurationParams); } public override void Init(IInternalConfigRoot configRoot, params object[] hostInitParams) { // Stash the filemap so we can see if the machine config was explicitly specified - _fileMap = (ConfigurationFileMap)hostInitParams[0]; + _fileMap = hostInitParams[0] as ConfigurationFileMap; base.Init(configRoot, hostInitParams); } diff --git a/src/libraries/System.Configuration.ConfigurationManager/tests/System.Configuration.ConfigurationManager.Tests.csproj b/src/libraries/System.Configuration.ConfigurationManager/tests/System.Configuration.ConfigurationManager.Tests.csproj index 44400470f84..8832712795c 100644 --- a/src/libraries/System.Configuration.ConfigurationManager/tests/System.Configuration.ConfigurationManager.Tests.csproj +++ b/src/libraries/System.Configuration.ConfigurationManager/tests/System.Configuration.ConfigurationManager.Tests.csproj @@ -103,6 +103,7 @@ + diff --git a/src/libraries/System.Configuration.ConfigurationManager/tests/System/Configuration/ImplicitMachineConfigTests.cs b/src/libraries/System.Configuration.ConfigurationManager/tests/System/Configuration/ImplicitMachineConfigTests.cs index 047d93c6cd1..5002173701f 100644 --- a/src/libraries/System.Configuration.ConfigurationManager/tests/System/Configuration/ImplicitMachineConfigTests.cs +++ b/src/libraries/System.Configuration.ConfigurationManager/tests/System/Configuration/ImplicitMachineConfigTests.cs @@ -2,7 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; using System.Configuration; +using System.Configuration.Internal; using System.IO; using Xunit; @@ -61,5 +63,24 @@ namespace System.ConfigurationTests Assert.Null(config.AppSettings); } } + + [Fact] + public void EnsureInitWithDifferentOrderHostParams() + { + string assemblyName = PlatformDetection.IsFullFramework ? "System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" : "System.Configuration.ConfigurationManager"; + + // InternalConfigFactory allows you to specify your own host / hostInitParams + // Ensure ImplictMachineConfigHost can init within this process and not throw an Invalid cast exception + using (var temp = new TempConfig(TestData.EmptyConfig)) + { + string typeName = "System.Configuration.Internal.InternalConfigConfigurationFactory, " + assemblyName; + + Type type = Type.GetType(typeName, true); + var configFactory = (IInternalConfigConfigurationFactory) Activator.CreateInstance(type, true); + var config = configFactory.Create(typeof(TempConfigurationHost), "test", new ConfigurationFileMap(temp.ConfigPath), "test"); + + Assert.NotNull(config); + } + } } } diff --git a/src/libraries/System.Configuration.ConfigurationManager/tests/System/Configuration/TempConfigurationHost.cs b/src/libraries/System.Configuration.ConfigurationManager/tests/System/Configuration/TempConfigurationHost.cs new file mode 100644 index 00000000000..304fd32fa0f --- /dev/null +++ b/src/libraries/System.Configuration.ConfigurationManager/tests/System/Configuration/TempConfigurationHost.cs @@ -0,0 +1,90 @@ +using System; +using System.Configuration; +using System.Configuration.Internal; +using System.Reflection; + +public class TempConfigurationHost : DelegatingConfigHost +{ + private static string s_assemblyName = PlatformDetection.IsFullFramework ? "System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" : "System.Configuration.ConfigurationManager"; + private static IInternalConfigConfigurationFactory s_configurationFactory; + + private ConfigurationFileMap _fileMap; + + public TempConfigurationHost() + { + Type type = Type.GetType(InternalHostTypeName, true); + Host = (IInternalConfigHost) Activator.CreateInstance(type, true); + } + + public override void Init(IInternalConfigRoot configRoot, params object[] hostInitParams) + { + Host.Init(configRoot, hostInitParams); + } + + public override void InitForConfiguration(ref string locationSubPath, out string configPath, out string locationConfigPath, + IInternalConfigRoot configRoot, params object[] hostInitConfigurationParams) + { + + Host.Init(configRoot, hostInitConfigurationParams); + + _fileMap = hostInitConfigurationParams[1] as ConfigurationFileMap; + + locationSubPath = ConfigurationFactory.NormalizeLocationSubPath(locationSubPath, null); + configPath = "MACHINE/EXE"; + locationConfigPath = locationSubPath; + } + + public override bool IsTrustedConfigPath(string configPath) + { + return true; + } + + public override bool IsLocationApplicable(string configPath) + { + return true; + } + + public override bool IsFullTrustSectionWithoutAptcaAllowed(IInternalConfigRecord configRecord) + { + return true; + } + + public override bool PrefetchAll(string configPath, string streamName) + { + return false; + } + + public override bool PrefetchSection(string sectionGroupName, string sectionName) + { + return false; + } + + public override string GetStreamName(string configPath) + { + return _fileMap.MachineConfigFilename; + } + + static string InternalConfigConfigurationFactoryTypeName + { + get { return "System.Configuration.Internal.InternalConfigConfigurationFactory, " + s_assemblyName; } + } + + static string InternalHostTypeName + { + get { return "System.Configuration.Internal.InternalConfigHost, " + s_assemblyName; } + } + + static internal IInternalConfigConfigurationFactory ConfigurationFactory + { + get + { + if (s_configurationFactory == null) + { + Type type = Type.GetType(InternalConfigConfigurationFactoryTypeName, true); + s_configurationFactory = (IInternalConfigConfigurationFactory) Activator.CreateInstance(type, true); + } + + return s_configurationFactory; + } + } +} \ No newline at end of file