CurrentCulture和SecurityException

时间:2011-06-22 18:22:57

标签: c# winforms exception

我们编写了一些使用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.

那有什么问题呢?为什么它只在某些条件下发生?

1 个答案:

答案 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类型的基础值在何时不会更改   数据由来自不同文化的用户读取或写入。