You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:22:20