VB.NET如何编写子例程将嵌入二进制资源写入指定文件
代码无法运行的核心原因
你的代码存在4个明确问题,直接导致导出失败:
- 资源参数类型错误:嵌入项目的二进制资源在
My.Resources中实际是Byte()(字节数组)类型,你将参数定义为Object传入后,BinaryWriter.Write不会写入原始二进制内容,只会写入对象的类型元数据,导出的文件完全损坏。 - 保存路径参数错误:你传入的
My.Computer.FileSystem.SpecialDirectories.Desktop只是桌面文件夹的路径,不包含目标文件名,IO类无法直接向文件夹对象写入文件。 BinaryWriter初始化错误:该类的构造函数不支持直接传入字符串路径,必须绑定一个可写的文件流对象才能工作,你传路径进去直接会抛参数类型错误。- 空
Catch块吞掉了所有运行时异常:所有报错都被你直接忽略,根本看不到具体错误信息,这也是你一直找不到问题的核心原因。
可复用修复方案
直接替换原来的子过程即可,代码自动处理资源释放,不需要手动关闭流:
Private Sub ExportBinaryResource(ByVal resourceBytes As Byte(), ByVal outputFullPath As String) If resourceBytes Is Nothing OrElse resourceBytes.Length = 0 Then Throw New ArgumentException("传入的二进制资源为空,请确认资源嵌入配置正确") End If If String.IsNullOrWhiteSpace(outputFullPath) Then Throw New ArgumentException("输出文件路径不能为空") End If ' Using语法会在执行结束后自动释放文件流,避免文件占用 Using fileStream As New FileStream(outputFullPath, FileMode.Create, FileAccess.Write) fileStream.Write(resourceBytes, 0, resourceBytes.Length) End Using End Sub
调用示例
调用时必须拼接完整的目标文件名(含后缀),不要只传文件夹路径:
' 拼接桌面路径+目标文件名,示例中导出为user32.dll,根据你的实际需求改文件名和后缀即可 Dim targetPath As String = Path.Combine( My.Computer.FileSystem.SpecialDirectories.Desktop, "user32.dll" ) ExportBinaryResource(My.Resources.user32, targetPath)
补充说明
- 该方法兼容所有二进制格式资源,不管是dll、exe、图片、压缩包都可以直接用,不需要修改逻辑。
- 调试阶段不要写无任何处理逻辑的空
Catch块,否则所有异常都会被隐藏,完全无法排查问题。 - 二进制资源导出不需要用
BinaryWriter,直接通过文件流写字节数组是最稳妥的方式,不会引入额外的格式转换问题。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

