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
相关产品推荐
相关产品推荐

