App.Configを文字列またはメモリストリームからロードできますか?
-
03-07-2019 - |
質問
次のコード行を使用して、別の場所からapp.configファイルをロードできることを知っています:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", ConfigFile);
ここで、ConfigFileはフルパスの場所です。ただし、app.config用に暗号化されたファイルを読み込むことができます。理想的には、ファイルを読み込み、解読し、文字列またはメモリストリームに読み込み、app.configのようにアプリに渡すことができるようにしたいと思います。すべての値をロードして手動でアクセスできることはわかっていますが、.NETの組み込み機能を使用してアクセスできるようにしたいと思います。ファイル以外の構成ファイルを使用するようにアプリに指示する方法はありますか?
他のオプションは、ファイルを開いて解読し、一時ファイルに書き出してから、上記のコードを使用してそのように参照することですが、より簡単な方法があれば、理想的には、追加のファイルを処理しないようにするために、見つけてください。
解決
これまでのところ、これに対する答えを得ることができませんでしたが、回避策を考え出す必要がありました。これは最善の解決策ではないかもしれませんが、機能します。基本的に、app.configファイルを暗号化し、新しい名前を付けました。アプリが起動すると、暗号化されたファイルを受け取り、それを解読して、Windowsの一時ファイルに書き込みます。これにより、ファイルは誰にも見つけられない一意のランダムな名前になり、Windowsが自動的に削除するため、ファイルを管理する必要はありません。このようにして、再起動するたびに、新しいファイルを書き直して使用することができます。興味のある人のための基本的なコードスニペットを次に示します。
この最初のメソッド LoadFileAppConfig()
は、ファイルをロードします。この場合、それらはサービスであるため、実行パスをロードし、適切なメソッドに渡す必要があります。復号化されたapp.configのパスを取得し、 SetData()
メソッドを使用してapp.configパスに設定します。
/// <summary>
/// Loads the Local App.Config file, and sets it to be the local app.config file
/// </summary>
/// <param name="p_ConfigFilePath">The path of the config file to load, i.e. \Logs\</param>
public void LoadFileAppConfig(string p_ConfigFilePath)
{
try
{
// The app.config path is the passed in path + Application Name + .config
m_LocalAppConfigFile = ProcessLocalAppConfig(p_ConfigFilePath + this.ApplicationName + ".config");
// This sets the service's app.config property
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", m_LocalAppConfigFile);
}
catch (Exception ex)
{
throw ex;
}
}
このメソッドでは、ファイルのパスを取得し、そのファイルを解読して文字列として返し、Windowsの一時ファイルにそのファイルを書き込みます。
public string ProcessLocalAppConfig(string p_ConfigFilePath)
{
try
{
string fileName = Path.GetTempFileName();
string unencryptedConfig = DecryptConfigData(p_ConfigFilePath);
FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);
StreamWriter streamWriter = new StreamWriter(fileStream);
if (!string.IsNullOrEmpty(unencryptedConfig))
{
try
{
streamWriter.BaseStream.Seek(0, SeekOrigin.End);
streamWriter.WriteLine(unencryptedConfig);
}
catch (IOException ex)
{
Debug.Assert(false, ex.ToString());
}
finally
{
streamWriter.Close();
}
return fileName;
}
return null;
}
catch (Exception)
{
throw;
}
}
この最後のメソッドは、暗号化されたapp.configのパスを取得し、Decryptionツールを使用してファイルを復号化し(ファイルを復号化できること、正しいファイルタイプであることを確認)、復号化されたコンテンツを上記のメソッドの文字列。
private string DecryptConfigData(string p_AppConfigFile)
{
string decryptedData = null;
TMS.Pearl.SystemFramework.CryptographyManager.CryptographyManager cryptManager = new TMS.Pearl.SystemFramework.CryptographyManager.CryptographyManager();
try
{
//Attempt to load the file.
if (File.Exists(p_AppConfigFile))
{
//Load the file's contents and decrypt them if they are encrypted.
string rawData = File.ReadAllText(p_AppConfigFile);
if (!string.IsNullOrEmpty(rawData))
{
if (!rawData.Contains("<?xml")) //assuming that all unencrypted config files will start with an xml tag...
{
decryptedData = cryptManager.Decrypt(rawData);
}
else
{
decryptedData = rawData;
}
}
}
}
catch (Exception)
{
throw;
}
return decryptedData;
}