使用StreamReader读取嵌入资源CSV时出现Value cannot be null错误如何解决
问题根因
你触发空参数异常的核心原因是 assembly.GetManifestResourceStream(resource) 返回了null,导致后续传入StreamReader的stream参数为空。
而返回null的原因是你传入的资源名不符合.NET嵌入资源的默认命名规则:
.NET 会默认使用
{程序集默认命名空间}.{文件相对于项目根目录的路径}.{文件名}作为嵌入资源的唯一标识名,你当前直接传入文件名open_postcode_geo_snippet.csv无法匹配到已嵌入的资源。
修复方案
- 直接修改资源名拼接规则,你的项目默认命名空间是
StreamCsv,CSV放在项目根目录,所以修改资源名字符串为:
string resource = "StreamCsv.open_postcode_geo_snippet.csv";
- (推荐)用反射动态获取命名空间,避免硬编码后续改命名空间出错:
string resource = $"{typeof(SeedCsv).Namespace}.open_postcode_geo_snippet.csv";
验证方法
如果你不确定正确的资源名,可以在获取资源前添加一行代码打印所有已嵌入的资源名,直接取匹配的即可:
Assembly assembly = Assembly.GetExecutingAssembly(); // 打印所有嵌入资源名,打断点或者控制台输出都可以 var allResources = assembly.GetManifestResourceNames(); foreach (var res in allResources) { Console.WriteLine(res); }
其他常见踩坑点
- 如果你的CSV文件放在项目的子文件夹下,比如
/Data/open_postcode_geo_snippet.csv,则资源名需要额外加上文件夹名:StreamCsv.Data.open_postcode_geo_snippet.csv - 注意文件名大小写,部分运行环境(如Linux、macOS)下资源名是大小写敏感的
内容的提问来源于stack exchange,提问作者Quintessa
相关产品推荐
相关产品推荐

