我们编写了一些使用Invariant Culture的winForms GUI应用程序。所以在Main的开头我们有:
[STAThread]
static void Main()
{
CultureInfo culture = CultureInfo.InvariantCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = culture;
...
问题是在某些机器上它运行得很好但在某些配置上的某些机器上(如x64机器上的Debug / AnyCPU)它会引发SequrityException
Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
那有什么问题呢?为什么它只在某些条件下发生?
答案 0 :(得分:1)
另一个post提到使用不变文化时的安全问题。也许这是你的问题?
使用InvariantCulture属性
The InvariantCulture property represents neither a neutral nor a
特定文化。它代表了第三种文化 文化不敏感。它与英语有关但是 不属于某个国家或地区。您的应用程序可以使用此属性 几乎与System.Globalization命名空间中的任何方法一样 需要一种文化。但是,应用程序应使用不变量 文化仅适用于需要与文化无关的结果的过程, 例如格式化和解析持久保存到文件的数据。在 在其他情况下,它产生的结果可能是语言上的 不正确或文化不合适。
Security Considerations If a security decision will be made based
关于字符串比较或案例更改的结果,您的应用程序 应该使用忽略大小写而不是使用的序数比较 InvariantCulture的。方法的默认实现,如 Compare()()()和ToUpper使用CurrentCulture属性。代码那个 执行文化敏感的字符串操作可以导致安全性 如果更改CurrentCulture或者文化上的漏洞,则会出现漏洞 运行代码的计算机不同于用于测试的文化 码。编写字符串操作时所期望的行为 与执行时代码的实际行为不同 电脑。相比之下,有序比较仅取决于 比较字符的二进制值。
String Operations If your application needs to perform a
不受值影响的区分文化的字符串操作 对于CurrentCulture,它应该使用接受CultureInfo的方法 参数。应用程序应指定的值 此参数的InvariantCulture属性。应用程序应该 将该属性与Compare()()()和ToUpper等方法一起使用 消除文化差异并确保一致的结果。更多 有关使用InvariantCulture属性执行的信息 文化不敏感的字符串操作,请参阅Culture-Insensitive String 操作
Persisting Data The InvariantCulture property is useful for
存储不会直接显示给用户的数据。存储 与文化无关的格式的数据保证了已知的格式 不会改变。当来自不同文化的用户访问数据时, 它可以根据特定用户进行适当格式化。例如, 如果您的应用程序将DateTime类型存储在文本文件中,则格式化 对于不变的文化,应用程序应该使用 调用ToString存储字符串时的InvariantCulture属性 和Parse方法来检索字符串。这种技术确保了 DateTime类型的基础值在何时不会更改 数据由来自不同文化的用户读取或写入。