问题标签 [settingsprovider]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1439 浏览

.net - .NET SettingsProvider/ApplicationSettingsBase 缓存

我正在查看一些使用 .NET System.Configuration.SettingsProvider 和 ApplicationSettingsBase 来处理配置的代码。

我们有一个派生自 SettingsProvider 的类,它使用数据库作为数据存储,然后我们有其他从 ApplicationSettingsBase 继承的设置类,并具有 [SettingsProvider(typeof(MySettingsProvider))] 属性。

问题是我们在多个应用程序中使用这些设置类,但它们似乎在第一次加载时永久缓存配置值。问题是,如果在一个应用程序中更改了设置,其他应用程序将在下次重新启动之前无法获得该设置,因为它们被缓存在任何地方。

我的问题是:有没有办法强制 SettingsProvider 实现或派生自 ApplicationSettingsBase 的类不缓存值,并在每次访问设置时重新查询数据存储?一个有效的答案可能是这些类不打算在多应用程序环境中使用......

0 投票
0 回答
2838 浏览

application-settings - 如何调用我的自定义设置提供程序?

我需要为我的设置文件指定一个不同的位置。经过长时间的搜索,我发现我必须编写自己的 SettingsProvider。我成功地创建了一个允许我通过其构造函数为设置文件指定路径的文件。以编程方式,我可以这样构造它:

var mycustomprovider = new CustomSettingsProvider(path);

我遇到的问题是无法调用我的自定义提供程序。我可以使用以下属性装饰 VS 2008 生成的设置文件:

但是,该属性不允许我用路径构造对象。此外,我希望能够以编程方式设置 SettingsProvider,以便我可以在运行时传递我想要的任何路径并保存我的设置。我在网上看到的示例从未提及如何以编程方式调用 SettingsProvider。

0 投票
1 回答
4956 浏览

c# - SettingsProviderAttribute 替换应用程序级自定义 SettingsProvider

在 .NET 应用程序中,如果您有特定的设置需要,例如将它们存储在数据库中,那么您可以替换LocalFileSettingsProvider为您的自定义设置提供程序,例如:

创建自定义设置提供程序以在应用程序之间共享设置

创建自定义设置提供程序

ApplicationSettingsBase要声明要使用特定提供程序的设置类(继承的),请使用它进行装饰并将SettingsProviderAttribute提供程序类型作为参数传递[SettingsProvider(typeof(MyCustomProvider))],否则它将使用默认值LocalFileSettingsProvider

我的问题:是否可以使用配置或技巧来强制我的应用程序在整个应用程序中使用我的自定义提供程序而不使用属性?

原因是我正在通过 MEF 加载插件,并且插件可能是通过 3rd 方编写的,我不希望他们关心如何处理设置。

0 投票
0 回答
179 浏览

c# - 如何使用多个 SettingsProviders

到目前为止,我一直将用户设置存储在注册表中,但我正在尝试使用ApplicationSettings. 从表面上看,事情很简单,但我在创建嵌套组时遇到了麻烦。

我有几个设置(在用户范围内)需要根据用户当前活跃的客户而有所不同。

例如,我可能会加载客户Mr Bloggs,并且设置DefaultPrice应该是12.34,但随后我会将客户更改为Mr Smith,他的DefaultPrice应该是22.90

我尝试使用自定义SettingsProvider,但在更改客户时无法刷新设置。如果我缺少一些简单的东西,我已经考虑过不使用ApplicationSettings但不想重新发明轮子。

我正在使用 C#、.NET 4.0 Full 和 Visual Studio 2010。 我该如何解决这个问题?

0 投票
1 回答
1656 浏览

c# - 如何使动态加载的程序集中的设置提供程序可用于反射?

按照这个问题,我在我们正在开发的旧版 C# 应用程序中成功创建了我的自定义设置提供程序。它通过SettingsProvider属性引用:

但是,现在我遇到了另一个问题。

我们的客户端应用程序包括一个自动更新工具,它的实现使得客户端的大部分——包括上面的类——被构建到一个 DLL(我们在这里称之为client.dll)中,然后由一个 EXE 使用。EXE 首先检查更新并在需要时从更新服务器下载最新的更新,将所有 DLL 等替换为其较新的版本(包括client.dll)。为了能够在运行时替换 DLL,它不能静态链接到它们。所以更新后,它会加载client.dll并像这样运行它:

这样做的不幸后果是框架在动态加载的程序集中找不到我的自定义设置提供程序类。我尝试使用LoadFrom而不是LoadFile上面,但它没有帮助。到目前为止,我发现的唯一可行的解​​决方案是在加载器 exe 中实现一个与实际设置提供程序同名的代理类,框架可以找到它。然后,代理从客户端程序集中实例化真正的设置提供程序,并将所有调用委托给它。

这似乎有效,但我对此并不满意。有没有办法帮助框架直接在动态加载的程序集中找到我的类?

更新

我得到的错误信息:

通过调试和日志消息,我确定永远不会调用该类的初始化方法,因此永远不会实例化该类。换句话说,上述异常背后似乎没有隐藏的初始化错误。

还有一点可能很重要:客户端当前在 .NET 2.0 上运行,并且在可预见的将来没有升级计划。

更新 2

我开始按照@jwddixon 的回答建议调查AppDomain。首先,我想检查 Client.dll 是否真的在与调用者 EXE 不同的应用程序域中结束。所以我列出了当前应用程序域中的程序集,并看到客户端实际上在那里。但令我惊讶的是,我注意到列表中实际上有两个名为Client的程序集 - EXE 和 DLL 具有相同的程序集名称,但版本不同(EXE 为 4.0.0.0,DLL 目前为 4.0.1352.0 )。到目前为止,我还没有完全意识到这一点,这可能很重要。接下来我将尝试更改 EXE 程序集名称...

更新 3

...这实际上解决了问题!Aaargh... 对于我不为人知的前辈发明了这个不知道为什么的扭曲方案,我此刻有非常不喜欢的想法...但是感谢你们所有人提出的问题和想法,最终导致了解决方案!

0 投票
1 回答
584 浏览

c# - 为什么读取设置属性值会使 SettingsPropertyValue 对象变脏?

在实现自定义设置提供程序时,我注意到访问设置属性的值会将其IsDirty标志更改为true.

Reflector 为我回答了为什么PropertyValuegetter 行为如此的问题 - 它包含如下语句:

乍一看,任何人都可以对这种奇怪的行为有所了解吗?

0 投票
2 回答
2934 浏览

c# - 如何更改我的 .NET 应用程序的预定义用户配置目录?

目前,我的应用程序的用户设置存储在此默认目录中:

我知道默认 Microsoft 命名规则的含义,我的问题是:如何在执行时更改该默认文件夹或通过修改 appconfig 文件?

我的意图是只能处理将保存我的应用程序的用户设置的目录,例如我想将用户设置文件保存在此目录中:

我知道这是可以实现的,因为我见过很多 .NET 应用程序可以将其用户配置文件存储在自定义漫游文件夹中,该文件夹不遵循带有未处理哈希和其他烦人命名规则的 Microsoft 默认规则。