假设我在.NET 4.0中有以下场景: - 包含以下内容的解决方案:a)类库b)控制台应用程序
控制台应用程序引用类库。
我想要的是在我的类库中设置一些应用程序设置,并使它们可以被类库访问(主机控制台应用程序不应该直接使用它们),但也可以通过.config文件修改部署(因此,如果用户决定要更改其中一个设置的值,则无需重新部署应用程序即可。
这可能吗?
答案 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个小时试图解决这个问题。