簡體   English   中英

使用C#在安裝時修改App.Config文件

[英]Modifying App.Config file at the time of installation using c#

<configuration>
  <configSections>
    <section name="ADMIN" type="System.Configuration.DictionarySectionHandler"/>
  </configSections>
  <User>    
    <add key="ExtendTime" value="20"/>
    <add key="Name" value="sss"/>
  </User>
<configuration>

我必須在用戶配置部分(即)中刪除第一個子元素。 如果您有任何想法請回復我。

我在用

Configuration config = ConfigurationManager.OpenExeConfiguration(Context.Parameters["assemblypath"]);
ConfigurationSection section = config.GetSection("USER");

本文可能包含您要查找的內容: http : //raquila.com/software/configure-app-config-application-settings-during-msi-install/

文章摘錄:

string exePath = string.Format("{0}MyWindowsFormsApplication.exe", targetDirectory);
Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);
config.AppSettings.Settings["Param1"].Value = param1;
config.AppSettings.Settings["Param2"].Value = param2;
config.AppSettings.Settings["Param3"].Value = param3;
config.Save();

編輯:添加其他代碼示例和博客參考: http : //ryanfarley.com/blog/archive/2004/07/13/879.aspx

using System;
using System.Xml;  
using System.Configuration;
using System.Reflection;
//...


public class ConfigSettings
{
    private ConfigSettings() {}

    public static string ReadSetting(string key)
    {
        return ConfigurationSettings.AppSettings[key];
    }

    public static void WriteSetting(string key, string value)
    {
        // load config document for current assembly
        XmlDocument doc = loadConfigDocument();

        // retrieve appSettings node
        XmlNode node =  doc.SelectSingleNode("//appSettings");

        if (node == null)
            throw new InvalidOperationException("appSettings section not found in config file.");

        try
        {
            // select the 'add' element that contains the key
            XmlElement elem = (XmlElement)node.SelectSingleNode(string.Format("//add[@key='{0}']", key));

            if (elem != null)
            {
                // add value for key
                elem.SetAttribute("value", value);
            }
            else
            {
                // key was not found so create the 'add' element 
                // and set it's key/value attributes 
                elem = doc.CreateElement("add");
                elem.SetAttribute("key", key);
                elem.SetAttribute("value", value); 
                node.AppendChild(elem);
            }
            doc.Save(getConfigFilePath());
        }
        catch
        {
            throw;
        }
    }

    public static void RemoveSetting(string key)
    {
        // load config document for current assembly
        XmlDocument doc = loadConfigDocument();

        // retrieve appSettings node
        XmlNode node =  doc.SelectSingleNode("//appSettings");

        try
        {
            if (node == null)
                throw new InvalidOperationException("appSettings section not found in config file.");
            else
            {
                // remove 'add' element with coresponding key
                node.RemoveChild(node.SelectSingleNode(string.Format("//add[@key='{0}']", key)));
                doc.Save(getConfigFilePath());
            }
        }
        catch (NullReferenceException e)
        {
            throw new Exception(string.Format("The key {0} does not exist.", key), e);
        }
    }

    private static XmlDocument loadConfigDocument()
    {
        XmlDocument doc = null;
        try
        {
            doc = new XmlDocument();
            doc.Load(getConfigFilePath());
            return doc;
        }
        catch (System.IO.FileNotFoundException e)
        {
            throw new Exception("No configuration file found.", e);
        }
    }

    private static string getConfigFilePath()
    {
        return Assembly.GetExecutingAssembly().Location + ".config";
    }
}

然后,您將像這樣使用它:

// read the Test1 value from the config file
string test1 = ConfigSettings.ReadSetting("Test1");

// write a new value for the Test1 setting
ConfigSettings.WriteSetting("Test1", "This is my new value");

// remove the Test1 setting from the config file
ConfigSettings.RemoveSetting("Test1");

我得出的結論是,在安裝過程中無法使用以下命令訪問自定義配置部分:

MyCustomConfigurationSection section = (MyCustomConfigurationSection)config.GetSection("MyCustomConfigurationSection");

安裝MSI軟件包時,執行的程序是Windows Install(MsiExec),而不是包含安裝程序類的程序。

'%windir%\system32\msiexec.exe

為了訪問配置,我們需要通過使用上下文來解決此問題:

Configuration config = ConfigurationManager.OpenExeConfiguration(this.Context.Parameters["assemblypath"]);

或者,通過使用反射來檢索執行程序集的位置:

Configuration config = ConfigurationManager.OpenExeConfiguration(System.Reflection.Assembly.GetExecutingAssembly().Location);

按照Chuck的建議,您可以訪問AppSettings並對其進行修改:

AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
appSettings.Settings["Environment"].Value = _Environment;
config.Save();

很好,因為安裝程序確切知道如何處理

System.Configuration.AppSettingsSection

因為該庫是.NET的一部分。 但是,當涉及到自定義部分時,安裝程​​序需要知道如何處理該自定義配置。 您很有可能將它放在應用程序引用的類庫(在DLL中)中,並且該DLL現在已安裝在安裝目錄中。

從上面我們知道,問題是,MSIExec.exe沒有在該目錄的上下文中運行,所以安裝失敗,當它無法在system32中找到合適的DLL時,將引發錯誤:

為“ XXX”創建配置節處理程序時發生錯誤:無法加載文件或程序集“ XXX.dll”或其依賴項之一。 該系統找不到指定的文件。

因此,訪問定制配置的唯一方法是將配置文件視為XML文檔,並使用傳統的XML管理工具對其進行編輯:

// load the doc
XmlDocument doc = new XmlDocument();
doc.Load(Assembly.GetExecutingAssembly().Location + ".config");

// Get the node
XmlNode node =  doc.SelectSingleNode("//MyCustomConfigurationSection");

// edit node here
// ...

// Save
doc.Save(Assembly.GetExecutingAssembly().Location + ".config");

正如Chuck在其原始答案的評論中指出的那樣, Ryan Farley的博客中描述了這種技術。

好消息! 我找到了一種解決此問題的方法。 解決方案是攔截程序集的加載並返回我們擁有的程序集。 這樣做

ResolveEventHandler handler = new ResolveEventHandler(CurrentDomain_AssemblyResolve);
AppDomain.CurrentDomain.AssemblyResolve += handler;
try
{
   section = config.GetSection("mySection") as MySection;
}
catch(Exception)
{
}
AppDomain.CurrentDomain.AssemblyResolve -= handler;

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.Name == "Dead.Beef.Rocks")
    {
        return typeof(MySection).Assembly;
    }
    return null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM