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

本文关键字:类库 应用程序 设置 程序修改 应用 主机 NET | 更新日期: 2023-09-27 17:56:47

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

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

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

这可能吗?

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

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

请参考系统.配置

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

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

经过相当多的谷歌工作后想通了这一点。

我采用的最终解决方案如下:我在服务应用程序中创建了设置(生成了 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 个小时试图解决这个问题。