嵌入资源文件读取触发System.ArgumentNullException问题求助
解决嵌入资源读取时的System.ArgumentNullException异常
出现Value cannot be null. Parameter name: stream错误,本质是GetManifestResourceStream未找到指定的嵌入资源、返回null,导致StreamReader初始化失败。以下是排查和解决步骤:
确认资源的完整名称
嵌入资源的名称不是单纯的文件名,而是项目命名空间 + 文件夹路径(如果有) + 文件名的组合。比如项目命名空间是MyApp、文件放在根目录,资源全名应为MyApp.File.sym。可以用这段代码列出当前程序集所有嵌入资源,找到正确名称:Imports System.Reflection Dim assembly As Assembly = Assembly.GetExecutingAssembly() For Each name In assembly.GetManifestResourceNames() Console.WriteLine(name) Next验证资源嵌入配置
右键项目中的File.sym文件→属性,确保:- 「生成操作」设置为Embedded Resource
- 「复制到输出目录」设置为「不复制」(资源已嵌入程序集,无需额外复制)
确认文件未被排除在项目外,重新生成项目。
修正资源读取代码
你已获取当前程序集实例,但后续读取时直接调用静态方法,建议改用实例调用,同时增加空值判断:Imports System.IO Imports System.Reflection Dim assembly As Assembly = Assembly.GetExecutingAssembly() Dim resourceStream As Stream = assembly.GetManifestResourceStream("正确的资源全名") If resourceStream Is Nothing Then Throw New InvalidOperationException("未找到指定的嵌入资源,请检查资源名称是否正确") End If Using reader As New StreamReader(resourceStream) Dim line As String Do line = reader.ReadLine() If line Is Nothing Then Exit Do Dim m = Regex.Match(line, "([^][]*)]") If m.Success Then Dim mapping As New Mapping() mapping.n = m.Groups(1).ToString() ' 此处添加mapping对象的后续处理逻辑 End If Loop End Using用
Using语句可自动释放StreamReader和Stream资源,避免内存泄漏;增加空值判断能提前抛出明确错误,方便排查。优化读取循环逻辑
原代码中Continue Do的写法会导致循环多执行一次,改成Exit Do更合理;同时增加正则匹配成功判断,避免匹配失败时获取空的Group值。
内容的提问来源于stack exchange,提问作者Lord45
相关产品推荐
相关产品推荐

