假设我在 .NET 4.0 中有以下场景: - 解决方案包含:a)类库 b)控制台应用程序
控制台应用程序引用类库。
我想要的是在我的类库中设置一些应用程序设置并使其可以被类库访问(主机控制台应用程序不应该直接使用这些),但也可以在部署后通过 .config 文件修改(所以如果用户决定他们想要更改其中一项设置的值,他们可以这样做而无需重新部署应用程序。
这可能吗?
假设我在 .NET 4.0 中有以下场景: - 解决方案包含:a)类库 b)控制台应用程序
控制台应用程序引用类库。
我想要的是在我的类库中设置一些应用程序设置并使其可以被类库访问(主机控制台应用程序不应该直接使用这些),但也可以在部署后通过 .config 文件修改(所以如果用户决定他们想要更改其中一项设置的值,他们可以这样做而无需重新部署应用程序。
这可能吗?
据我所知,类库将可以通过点网配置管理框架访问主机文件配置文件。您还可以使用库已知名称的第二个配置文件,并使用 swme 框架在库初始化时手动加载它。
请参考 System.Configuration
var configurationFileMap = new ConfigurationFileMap(@"c:\myconfig.config");
var configuration = ConfigurationManager.OpenMappedMachineConfiguration(configurationFileMap);
主机和库都应该能够访问 myfile.config,只要他们知道它的名称。如果你想让它更通用,你可以将配置文件的名称存储在一个已知的注册表项下
经过相当多的Google-fu后才弄清楚这一点。
我采用的最终解决方案如下:我在我的服务应用程序中创建了设置(它生成了一个 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 个小时试图解决这个问题。