我通过已有的 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);
求教
使用下面两种:
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 属性不匹配。
@LoveLong:
CultureAndRegionModifiers.Neutral | CultureAndRegionModifiers.Replacement //它是一个用[Flags]标记的enum.
另外,我觉得就算可以,这也不是一个好方法,在老版本里面能运行,拿出来不能运行,是不是你的nfx版本不一致,运行的host环境不一样呢。如果一定要兼容最好让它们环境都一样。
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);
//试试看咯...
@czd890: 不行,注册时候会报错:
“System.InvalidOperationException”类型的未经处理的异常在 Transfar.exe 中发生
其他信息: “Register”方法失败,因为自定义区域性“en”已存在。
@czd890: 如果是先使用:CultureAndRegionInfoBuilder.Unregister("en");
再使用上面的语句,注册不会报错,但是:
locale.KeyboardLayoutId 取值还是错误的 9
另外,我使用了和服务器一致的nfx版本,也是会报错
对应的英文错误信息是:
Culture ID 9 (0x0009) is a neutral culture; a region cannot be created from it.
参考:
找遍
– dudu 4年前上面
的每一个角落,也没找到上面描述的错误
,你把它藏哪了?@dudu: 问题已经修改了,加了错误信息,你可以直接试一下我的写法,会直接报错的
– LoveLong 4年前