.NET从主机应用程序修改类库应用程序设置

时间:2013-01-29 23:03:11

标签: c# vb.net .net-4.0 class-library application-settings

假设我在.NET 4.0中有以下场景: - 包含以下内容的解决方案:a)类库b)控制台应用程序

控制台应用程序引用类库。

我想要的是在我的类库中设置一些应用程序设置,并使它们可以被类库访问(主机控制台应用程序不应该直接使用它们),但也可以通过.config文件修改部署(因此,如果用户决定要更改其中一个设置的值,则无需重新部署应用程序即可。

这可能吗?

2 个答案:

答案 0 :(得分:1)

据我所知,类库可以通过dot net配置管理框架访问主机文件配置文件。您还可以使用库中已知名称的第二个配置文件,并使用swme框架在库初始化时手动加载它。

请参考System.Configuration

var configurationFileMap = new ConfigurationFileMap(@"c:\myconfig.config");
var configuration = ConfigurationManager.OpenMappedMachineConfiguration(configurationFileMap);

主机和lib都应该能够访问myfile.config,只要它们知道它的名称即可。如果要使其更通用,可以将配置文件的名称存储在已知的注册表项

答案 1 :(得分:0)

在相当多的Google-fu之后想出这个。

我采用的最终解决方案如下: 我在我的服务应用程序中创建了Settings(生成app.config文件)。然后,我在代码库项目和控制台应用程序项目中创建了这些设置的链接(这是通过转到添加>现有项目>然后点击添加按钮旁边的下拉箭头并选择"添加来完成的作为链接"。虽然代码库项目中的那个不是必需的。

这样做是为了让我在开发过程中只有1个设置配置,同时它仍然会为我的控制台应用程序生成一个配置文件,我可以在开发过程中从控制台应用程序和代码库中访问它。

最后,我使用下面的代码打开配置文件并访问值。作为免责声明,可能有一种更简单的方法,但我尝试了大约100种组合,没有其他工作:

        String cfgFileName = "IntercompanyConsoleApp.exe.config";
        ExeConfigurationFileMap cfgMap = new ExeConfigurationFileMap();
        cfgMap.ExeConfigFilename = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + cfgFileName;

        Configuration cfg = ConfigurationManager.OpenMappedExeConfiguration(cfgMap, ConfigurationUserLevel.None);

        // IntercompanyService is the name of my service app, which is where the real app.config file resides -- hence the entries in the xml are based on this application.
        // Also, the scope of my settings entries is Application
        ClientSettingsSection section = (ClientSettingsSection)cfg.GetSection("applicationSettings/IntercompanyService.Properties.Settings"); 

        Console.WriteLine(section.Settings.Get("Server").Value.ValueXml.InnerText);
        Console.WriteLine(section.Settings.Get("Database").Value.ValueXml.InnerText);                        

这是一个不起眼的问题,但希望将来可以节省一些时间,因为我花了大约4个小时试图解决这个问题。