Non è detto che per leggere un file di configurazione (per esempio un web.config) di un'altra applicazione, bisogna per forza utilizzare le classi XML. Basta essere folli e scrivere una cosa come questa qui sotto, sparata oggi - e di cui ne sono contento :-)
In una web application Test, che ha questo web.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="fooMessage" value="Hello World!" />
</appSettings>
</configuration>
aggiungiamo questa classe:
using System;
using System.Configuration;
using System.Collections.Specialized;
namespace Ugidotnet.Configuration
{
public sealed class CrossConfigSetter
{
private CrossConfigSetter(){}
public const string DataName = "AppSettings";
public static void SetAppSettingsData()
{
NameValueCollection serializableAppSettings = new NameValueCollection(ConfigurationSettings.AppSettings);
AppDomain.CurrentDomain.SetData(DataName, serializableAppSettings);
}
}
}
mentre nella console application da cui vogliamo leggere il web.config della web application Test, scriviamo:
using System;
using System.Configuration;
using System.Collections.Specialized;
namespace Ugidotnet.Configuration
{
public sealed class CrossConfigGetter
{
private CrossConfigGetter(){}
public static NameValueCollection GetAppSettingsData(string configFileName, CrossAppDomainDelegate setter, string dataName)
{
NameValueCollection ret;
AppDomainSetup ads = new AppDomainSetup();
ads.ConfigurationFile = configFileName;
AppDomain ad = AppDomain.CreateDomain(Guid.NewGuid().ToString(), null, ads);
ad.DoCallBack(setter);
ret = ad.GetData(dataName) as NameValueCollection;
AppDomain.Unload(ad);
return ret;
}
}
}
per poi utilizzarla così:
using System;
using System.Collections.Specialized;
using Ugidotnet.Configuration;
class TestCrossConfig
{
static void Main()
{
string webConfigFileName = "C:\\Inetpub\\wwwroot\\Test\\Web.config";
NameValueCollection appSettings = CrossConfigGetter.GetAppSettingsData(
webConfigFileName,
new CrossAppDomainDelegate(CrossConfigSetter.SetAppSettingsData),
CrossConfigSetter.DataName);
Console.WriteLine(appSettings["fooMessage"]);
}
}
Commenti graditi.