首页 新闻 会员 周边 捐助

C# .NET 中 CultureInfo 的问题

0
悬赏园豆:20 [待解决问题]

我通过已有的 dll 反编译获得一段代码,里面有下面的用法:

var locale = new CultureInfo("en");
var ri = new RegionInfo(locale.KeyboardLayoutId);

只是这段代码由于 "en" 的关系,会报错:
“System.ArgumentException”类型的未经处理的异常在 mscorlib.dll 中发生
其他信息: 区域性 ID 9 (0x0009)是非特定区域性。不能从中创建区域。

平时我们可能会有下面的正常代码(不报错):
var locale = new CultureInfo("en-US");
var ri = new RegionInfo(locale.KeyboardLayoutId);

这个dll在现有的项目中运行没有问题(无源码,只能反编译),但是单独拿出来调用的话就会报错(上面描述的错误),只是现在又必须要使用这个 dll,请问在调用这个 dll 时候,如何才能让 dll 中的下面写法的代码不报错呢?

var locale = new CultureInfo("en");
var ri = new RegionInfo(locale.KeyboardLayoutId);

求教

程序员丁的主页 程序员丁 | 初学一级 | 园豆:119
提问于:2020-03-17 19:02

找遍上面的每一个角落,也没找到上面描述的错误,你把它藏哪了?

dudu 4年前

@dudu: 问题已经修改了,加了错误信息,你可以直接试一下我的写法,会直接报错的

LoveLong 4年前
< >
分享
所有回答(2)
0
czd890 | 园豆:14488 (专家六级) | 2020-03-17 21:35

使用下面两种:
var cib = new CultureAndRegionInfoBuilder("en", CultureAndRegionModifiers.None);
var cib = new CultureAndRegionInfoBuilder("en", CultureAndRegionModifiers.Neutral);
会出现:不指定 CultureAndRegionModifiers.Replacement 标记,就无法替换内置的区域性 en。

使用:
var cib = new CultureAndRegionInfoBuilder("en", CultureAndRegionModifiers.Replacement);
会出现:CultureAndRegionModifiers.Neutral 标志与区域性 en 的 CultureInfo.Neutral 属性不匹配。

支持(0) 反对(0) 程序员丁 | 园豆:119 (初学一级) | 2020-03-18 09:01

@LoveLong:
CultureAndRegionModifiers.Neutral | CultureAndRegionModifiers.Replacement //它是一个用[Flags]标记的enum.

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2020-03-18 11:50

另外,我觉得就算可以,这也不是一个好方法,在老版本里面能运行,拿出来不能运行,是不是你的nfx版本不一致,运行的host环境不一样呢。如果一定要兼容最好让它们环境都一样。

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2020-03-18 11:52
 var cib = new CultureAndRegionInfoBuilder(
                         "en", CultureAndRegionModifiers.Neutral| CultureAndRegionModifiers.Replacement);
 CultureInfo ci = new CultureInfo("en-US");
 cib.KeyboardLayoutId = ci.KeyboardLayoutId;

cib.Register();

var locale = new CultureInfo("en");
var ri = new RegionInfo(locale.KeyboardLayoutId);

//试试看咯...
支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2020-03-18 11:59

@czd890: 不行,注册时候会报错:
“System.InvalidOperationException”类型的未经处理的异常在 Transfar.exe 中发生
其他信息: “Register”方法失败,因为自定义区域性“en”已存在。

支持(0) 反对(0) 程序员丁 | 园豆:119 (初学一级) | 2020-03-18 12:39

@czd890: 如果是先使用:CultureAndRegionInfoBuilder.Unregister("en");
再使用上面的语句,注册不会报错,但是:
locale.KeyboardLayoutId 取值还是错误的 9

另外,我使用了和服务器一致的nfx版本,也是会报错

支持(0) 反对(0) 程序员丁 | 园豆:119 (初学一级) | 2020-03-18 13:13
0

对应的英文错误信息是:

Culture ID 9 (0x0009) is a neutral culture; a region cannot be created from it.

参考:

dudu | 园豆:30939 (高人七级) | 2020-03-18 10:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册