上下文:用VB.NET编写的程序,在VisualStudio2012中开发/维护,针对框架v3.5。
几年前,该程序在 VB(6) 中,我们将其“翻译”为 VB.NET。由于大部分是自动化的转换,我们在代码中仍有相当多的地方处理文本表示的双精度(和日期/...)格式,如下所示:
Dim sValue As String = Microsoft.VisualBasic.Compatibility.VB6.Format(dblValue, "0.00")
相反,当我们需要从这样的字符串中提取 Double 值时,我们使用
Dim dblValue As Double = CDbl(sValue)
CDbl“监听”应用程序线程的 System.Globalization.CultureInfo.CurrentCulture,当您在代码运行期间通过控制面板更改区域设置时,这不会改变。
但是,在代码中执行的 VB6.Format 开始符合应用程序的 currentCulture(如您所料),但显然(我不知道这一点,但偶然发现)在区域设置中收听 CHANGES 和立即响应您在程序执行期间所做的任何更改。这意味着 CDbl() 和 VB6.Format() 变得相互不一致。
当然,在程序执行期间更改区域设置很麻烦,而且,如果您希望支持它,您可以通过捕获 SystemEvents.UserPreferenceChanged(和 -Changing)事件来管理它并根据它们的发生采取行动。
然而,关于文化/区域设置的变化,VB6.FORMAT 与“正常”转换为 CDbl(someString) 的“不同行为”让我觉得不受欢迎。最好让 VB6.Format 始终遵守应用程序/线程 CurrentCulture,然后您可以选择您希望代码如何响应用户偏好更改。此外,我想对这个问题有更多的了解。
因此,我的问题是:有没有办法编译/安排/...诸如 (Microsoft.VisualBasic.Compatibility.)VB6.Format 监听应用程序-CurrentCulture 并且不响应 - 未经“我们的同意” -更改区域设置?
附加信息:该程序是用 - 对于 visualbasic 的东西 - 项目 (VisualStudio2012) 中的一个引用来编译的:C:\Windows\Microsoft.Net\Framework\V2.0.50727\Microsoft.VisualBasic.Compatibility.dll (和.. .Data.dll)。
欢迎任何“教育”信息或建议。这个问题并没有在我们的程序中造成任何真正的问题,但我觉得我们应该/可能有更好的理解,甚至可能有方法让事情变得更健壮。