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

VB.NET如何从资源文件读取十六进制代码并执行HelloWorld函数?

实现步骤

1. 确认项目资源配置

确保存储十六进制代码的文本文件已添加到项目资源中,可在项目属性的「资源」选项卡中查看并确认资源名称(示例中使用HexVBCode作为资源名称)。

2. 编写按钮点击事件代码

根据你的十六进制内容类型(VB源代码的十六进制/编译后程序集字节的十六进制),选择对应实现方式:

情况1:十六进制为VB函数源代码的转码结果

假设原VB函数为:

Public Sub ShowHelloWorld()
    MsgBox("HelloWorld")
End Sub

将这段代码转成十六进制字符串存入资源后,按钮点击事件代码如下:

Imports Microsoft.VisualBasic
Imports System.CodeDom.Compiler
Imports System.Reflection

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' 读取资源中的十六进制字符串
    Dim hexCode As String = My.Resources.HexVBCode.Trim()
    
    ' 将十六进制还原为VB源代码
    Dim vbSource As String = HexToText(hexCode)
    
    ' 动态编译并执行代码
    Using provider As New VBCodeProvider()
        Dim compileParams As New CompilerParameters()
        compileParams.GenerateInMemory = True
        ' 添加必要的程序集引用
        compileParams.ReferencedAssemblies.Add("System.dll")
        compileParams.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
        
        ' 构造完整的可编译代码结构
        Dim fullCode As String = $"
Namespace TempCodeSpace
    Public Class TempRunner
        {vbSource}
    End Class
End Namespace"
        
        ' 执行编译
        Dim compileResult As CompilerResults = provider.CompileAssemblyFromSource(compileParams, fullCode)
        
        ' 处理编译错误
        If compileResult.Errors.HasErrors Then
            For Each err As CompilerError In compileResult.Errors
                MsgBox($"编译错误:{err.ErrorText}")
            Next
            Return
        End If
        
        ' 创建实例并调用目标函数
        Dim runnerType As Type = compileResult.CompiledAssembly.GetType("TempCodeSpace.TempRunner")
        Dim runnerInstance As Object = Activator.CreateInstance(runnerType)
        runnerType.InvokeMember("ShowHelloWorld", BindingFlags.InvokeMethod Or BindingFlags.Public Or BindingFlags.Instance, Nothing, runnerInstance, Nothing)
    End Using
End Sub

' 辅助方法:十六进制字符串转普通文本
Private Function HexToText(hexStr As String) As String
    Dim result As New System.Text.StringBuilder()
    For i As Integer = 0 To hexStr.Length - 1 Step 2
        Dim hexSegment As String = hexStr.Substring(i, 2)
        result.Append(Chr(Convert.ToByte(hexSegment, 16)))
    Next
    Return result.ToString()
End Function

情况2:十六进制为编译后程序集(DLL)的字节转码结果

若你是先将VB函数编译成类库,再把DLL字节转成十六进制存入资源,可使用以下简化代码:

Imports System.Reflection

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' 读取资源中的十六进制字符串
    Dim hexCode As String = My.Resources.HexVBCode.Trim()
    
    ' 将十六进制还原为程序集字节数组
    Dim assemblyBytes As Byte() = HexToBytes(hexCode)
    
    ' 加载程序集并调用目标函数
    Dim targetAssembly As Assembly = Assembly.Load(assemblyBytes)
    ' 替换为你实际的类命名空间+类名
    Dim targetType As Type = targetAssembly.GetType("YourNamespace.YourClass")
    Dim instance As Object = Activator.CreateInstance(targetType)
    ' 替换为你实际的函数名
    targetType.InvokeMember("ShowHelloWorld", BindingFlags.InvokeMethod Or BindingFlags.Public Or BindingFlags.Instance, Nothing, instance, Nothing)
End Sub

' 辅助方法:十六进制字符串转字节数组
Private Function HexToBytes(hexStr As String) As Byte()
    Dim byteCount As Integer = hexStr.Length \ 2
    Dim bytes As Byte() = New Byte(byteCount - 1) {}
    For i As Integer = 0 To byteCount - 1
        bytes(i) = Convert.ToByte(hexStr.Substring(i * 2, 2), 16)
    Next
    Return bytes
End Function

内容的提问来源于stack exchange,提问作者Capitan504

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:05:04