【问题标题】:How can I configure my C# project without recompiling? [duplicate]如何在不重新编译的情况下配置我的 C# 项目? [复制]
【发布时间】:2020-05-04 06:34:13
【问题描述】:

所以我想用 .exe 执行我的程序,并且我想在不实际写入代码的情况下配置我的程序。

我的代码中有一些是与否的问题,例如: 你想压缩什么?文件/目录。 编辑:我不想在控制台应用程序中回答这些问题,我想在之前回答这些问题,就像在“设置”之前一样。

我的问题是,我可以在不写入代码的情况下回答这些问题,并以这种方式使这个应用程序可执行吗?有什么程序吗?

感谢您的回答!

【问题讨论】:

  • Without writing into it 对你意味着什么?
  • 存储范围广泛,从简单的结构化 Xml 或 Json 文件到任何风格的真实数据库。
  • 我认为您的意思是命令行参数 - 请参阅 docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
  • @Polyfun 不,不是命令行参数 - 只是要运行的项目的可配置数据源。
  • 查看应用程序设置、数据持久性、注册表..

标签: c# configuration executable


【解决方案1】:

根据您的使用偏好,您可以使用 2 种方法,第一个建议是如果您正在使用您的程序并且您不经常设置值

  1. 您可以使用 app.config 文件并添加相关值并通过代码将它们作为变量调用。

  2. 您可以将一个小的配置文件写入 xml 文件或 json 文件并轻松编辑它,这对于使用您的应用程序的客户端也可以通过配置文件轻松更改配置。

为此,请尝试使用 xml 序列化和反序列化对象, 如果需要,我会添加代码示例。

编辑 要使用外部配置,您需要下一个类: 1.配置数据对象

[Serializable]
public class Configuration : ICloneable
{
    public Configuration()
    {
        a = "a";
        b= "b"
    }

    public string a { get; set; }
    public string b { get; set; }

    public object Clone()
    {
        return new Configuration
        {
            a = a,
            b= b
        };
    }
}
  1. 文件读写类

    public class ConfigurationHandler
    {
     // full path should end with ../file.xml
     public string DefaultPath = "yourPath";
    
    public ConfigurationHandler(string path = "")
    {
        if (!File.Exists(DefaultPath))
        {
            Directory.CreateDirectory(Path.GetDirectoryName(DefaultPath));
            FileStream file = File.Create(DefaultPath);
            file.Close();
    
            Configuration = new Configuration();
            SaveConfigurations(DefaultPath);
        }
    }
    
    public void SaveConfigurations(string configPath = "")
    {
        if (string.IsNullOrEmpty(configPath))
            configPath = DefaultPath;
        var serializer = new XmlSerializer(typeof(Configuration));
        using (TextWriter writer = new StreamWriter(configPath))
        {
            serializer.Serialize(writer, Configuration);
        }
    }
    
    
    public Configuration LoadConfigurations(string configPath = "")
    {
        if (string.IsNullOrEmpty(configPath))
            configPath = DefaultPath;
        using (Stream reader = new FileStream(configPath, FileMode.Open))
        {
            // Call the Deserialize method to restore the object's state.
            XmlSerializer serializer = new XmlSerializer(typeof(Configuration));
            Configuration = (Configuration)serializer.Deserialize(reader);
        }
        return Configuration;
    }
    

    }

  2. 要获取配置实例,您可以从程序中使用它:

    static void Main(string[] args) {

    var config = new ConfigurationHandler().LoadConfigurations();
    //....
    

    }

【讨论】:

  • 我的第一个想法也是 json,我试图弄清楚它是如何工作的。我是 C# 和 .NET 的新手。
  • @TinM Serializing a list to JSON可以给你一些线索。
猜你喜欢
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 2022-06-28
  • 2015-04-14
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多