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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:12:25