Пока я так и не смог получить ответ на этот вопрос, мне пришлось придумать обходной путь. Возможно, это не лучшее решение, но оно работает. По сути, мы зашифровали наш файл 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, использует наш инструмент расшифровки для дешифрования файла (гарантируя, что мы можем расшифровать его, и что это правильный тип файла), а затем возвращает расшифрованное содержимое как Строка для метода выше.
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;
}