Winform应用程序:已编译的类似于app.Config的文件

本文关键字:类似于 app Config 文件 编译 应用程序 Winform | 更新日期: 2023-09-27 18:24:17

我想知道是否有某种内置编译的"App.Config"文件?

目标是能够让我们的库中的一个在某些客户端应用程序中使用时可以覆盖其某些默认值。Thoses DLL是动态加载的,所以我不能只在构造函数中给出一个参数。

我不想使用App.config文件,因为用户可以编辑这些值(否则就可以了)。

Winform应用程序:已编译的类似于app.Config的文件

有几种不同的方法可以解决这个问题。

如果你喜欢配置文件的想法,但不想让最终用户在编译的应用程序中访问它,也许你可以以适合你需要的格式创建自己的设置文件,并将其作为嵌入式资源包括在内?

这样做的好处是,您可以在VisualStudio中以常规XML或配置文件或其他文件的形式访问它,而它将对最终用户隐藏。就我个人而言,我认为我更喜欢使用特殊的代码/类来存储配置数据。

若要将文件作为嵌入资源包含,请将其包含到某个Visual Studio项目中,右键单击包含的文件并选择Properties。现在,在"Build Action"下,选择"Embedded Resource"。当您现在构建项目时,该文件将包含在生成的.dll文件中。

我相信你会找到很多关于如何从代码访问嵌入式资源的信息。例如,在这个SO问题中有一些有用的例子。请特别注意这个答案,它还提到了包含资源的另一种方式。

扩展我的评论。。。您可以为具有硬编码值的设置类创建一个接口,然后对该接口进行不同的实现。要真正更改要使用的行,您所需要做的就是在构建dll:之前,将实例化对象的行注释/取消注释到您的设置变量中

public class MainDllProject
{
    ISettings m_Settings;
    public MainDllProject()
    {
        // Change this before compiling
        this.m_Settings = new DebugSettings();
        //this.m_Settings = new DeploySettings();
        // use settings from the settings class
        String setting1 = this.m_Settings.Setting1
        Int32 setting2 = this.m_Settings.Setting2
        //...
    }
}
public interface ISettings
{
    String Setting1 { get; }
    Int32 Setting2 { get; }
}

public class DebugSettings: ISettings
{
    public String Setting1
    { get { return "data_debug";} }
    public Int32 Setting2
    { get { return 2;} }
}
public class DeploySettings: ISettings
{
    public String Setting1
    { get { return "data_deploy";} }
    public Int32 Setting2
    { get { return 1;} }
}

正如你所说,在找到"解决这个问题的内置方法"时,也许这对你有用。。。

实际上,您可以使用Visual Studio生成配置管理器来使用不同的设置进行生成。使用#If指令,可以根据配置自动选择要使用的代码行。一个基于默认调试配置的简单示例,它自动添加"debug=True"变量:

public MainDllProject()
{
    #If DEBUG Then
    this.m_Settings = new DebugSettings();
    #ElseIf
    this.m_Settings = new DeploySettings();
    #End if
}

实际上,您可以像DEBUG一样创建自己的自定义命名变量进行检查:进行配置后,打开项目属性窗口,转到"编译"选项卡,在下拉列表中选择特定配置,然后在底部选择"高级编译选项"。中有一行"自定义常量",您可以在其中添加此类变量。对于简单的if语句,您只需生成一个布尔值,如"CLIENTDEPLOY=True",然后就可以在代码中使用#If CLIENTDEPLOY Then