C# WinForm中Resx存10万条记录访问报错的解决需求
问题原因
你遇到的System.TypeLoadException是因为.NET对单个类型的方法数量有硬限制(最大65535个,即2^16-1)。Resx文件会自动生成对应的Properties.Resources类,每个资源条目都会生成一个独立的getter方法,当条目数超过6万左右时,方法总数就会触碰到这个限制,导致加载类型失败。
解决方案
1. 改用外部存储文件(推荐)
放弃用Resx存储大量数据,改用JSON、XML或者CSV这类轻量级文件,或者直接用本地数据库(比如SQLite)。程序启动时直接读取这些文件的内容,避免生成大量getter方法。
示例:读取JSON文件的代码
// 假设数据存在Resources/Data.json文件中 var jsonContent = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "Data.json")); var dataList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<YourDataModel>>(jsonContent);
这种方式不仅避开方法数限制,还更灵活,数据修改也不需要重新编译程序。
2. 拆分Resx文件
把10万条记录拆分成多个Resx文件,比如分成2个各5万条的Resx(如Resources1.resx、Resources2.resx),每个Resx对应的自动生成类的方法数都不会超过限制。访问时分别从不同的Resources类中获取数据:
var item1 = WindowsFormsApp1.Properties.Resources1.Item_00001; var item50001 = WindowsFormsApp1.Properties.Resources2.Item_50001;
这种方式不需要改太多代码,但管理多个Resx文件会比较繁琐。
3. 手动读取Resx文件
不依赖自动生成的Resources类,直接用ResXResourceReader读取Resx文件内容,这样不会生成任何getter方法:
var resxPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Properties", "Resources.resx"); using var reader = new ResXResourceReader(resxPath); foreach (DictionaryEntry entry in reader) { var key = entry.Key.ToString(); var value = entry.Value.ToString(); // 处理每条数据 }
这种方式适合不想改变现有存储格式的场景,但需要自己处理数据的读取和缓存。
内容的提问来源于stack exchange,提问作者Gurunand Mourya
相关产品推荐
相关产品推荐

