C# Winform应用程序:编译的app.Config类文件?

C# Winform应用程序:编译的app.Config类文件?,c#,winforms,C#,Winforms,我想知道是否有某种内置编译的App.Config文件 我们的目标是使我们的一个库能够在某些客户端应用程序中使用时覆盖它的一些默认值。 这些DLL是动态加载的,所以我不能只在构造函数中给出一个参数 我不想使用App.config文件,因为用户可以编辑这些值,这样就可以了。有几种不同的方法可以解决这个问题 如果您喜欢配置文件的想法,但不希望最终用户在编译后的应用程序中可以访问它,那么您可以创建自己的设置文件,使用适合您需要的格式,并将其作为嵌入式资源包括在内 这样做的好处是,您可以在VisualSt

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

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


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

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

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

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

要将文件作为嵌入式资源包含,请将其包含到一个Visual Studio项目中,右键单击包含的文件并选择“属性”。现在在Build Action下,选择Embedded Resource。现在构建项目时,该文件将包含在生成的.dll文件中


我相信您将能够找到大量关于如何从代码访问嵌入式资源的信息。举个例子,这里有一些。特别要注意的是,它还提到了包含资源的另一种方式。

在我的评论上展开。。。您可以使用硬编码值为设置类创建一个接口,然后对该接口进行不同的实现。要实际更改要使用的设置,您只需在构建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;} }
}
在找到解决这个问题的内在方法时,正如你所说的,也许这对你会有用

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

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

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

根据您的描述,a可能是存储默认值的解决方案。但是如何覆盖它们呢?如果它是一个重建,那么它看起来就像完全可以在代码中完成。您总是可以创建一个设置类接口,然后为每个不同的用例创建不同的实现类。然后,您可以更改将哪个实现实例化到构造函数中的接口类型设置变量中,并重新生成dll。为它们提供一个设置类,该类具有可重写的值(具有属性getter和setter),以及只读值(仅具有返回硬编码默认值的getter)。客户端负责存储覆盖的值,以便在应用程序重新启动时能够再次设置这些值。@Filburt:好的,但是您如何访问这些值呢?因为我们应该根据哪个客户端有不同的值,所以如何在不知道Resx类型的情况下提供此Resx的内容?@nyrguds被覆盖,我的意思是库有一些默认值,目标是检查此特定客户端应用程序是否指定了某些内容,如果是,则使用特定值,否则使用默认值。在动态加载的DLL和客户机项目之间有4-6个层,因此在所有链中提供一个设置非常困难,其中一个层是通过单例提供的。另外,大多数动态加载的DLL不需要这个文件。我的问题更多的是关于解决这个问题的内置方法,我有很多想法,如果我必须自己通过自定义XML来实现的话。但不管怎样,我明白你的意思了。如果我自己做的话,我会做一个自定义XML文件,它加载在一个可以在任何我喜欢的地方访问的单例对象中,但这意味着ISettings必须包含一个可以在我们的解决方案的任何应用程序中使用的每个属性的详尽列表,最简单的解决方案是将它们作为文本文件资源嵌入,过滤系统选择正确的资源,然后对其进行解析。但你明确要求进行编译设置。这是获得co的方法 mpiled设置。