vb.net - 使用 System.Reflection.Emit 在 Windows.Forms 中显示 MessageBox

标签 vb.net reflection reflection.emit il

我正在尝试使用 ilgenerator.emit 做一个 msgbox,但是当我运行代码时出现异常:

exception generated from destination of a call



这是我的代码:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim assemblyName As AssemblyName = New AssemblyName("SamAsm")
    Dim assemblyBuilder As AssemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave)

    'Creating module
    Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("SamAsm.exe")

    Creating class file
    Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("SamAsmType", TypeAttributes.Public Or TypeAttributes.Class)

    Creating Main Method
    Dim methodBuilder1 As MethodBuilder = typeBuilder.DefineMethod("Main", MethodAttributes.Static Or MethodAttributes.Public, GetType(Void), New System.Type() {GetType(String)})

    'Generating Code for method builder in IL
    Dim ilGenerator As ILGenerator = methodBuilder1.GetILGenerator
    ilGenerator.Emit(OpCodes.Ldstr, "test")
    ilGenerator.EmitCall(OpCodes.Call, GetType(System.Windows.Forms.MessageBox).GetMethod("Show", {GetType(String)}), {GetType(String)})
    ilGenerator.Emit(OpCodes.Ret)

    'Creating Class object (type) and accessing main method
    Dim SamAsmType As Type = typeBuilder.CreateType
    SamAsmType.GetMethod("Main").Invoke(Nothing, New String() {Nothing})

    'Creating Entry Point and saving assembly
    assemblyBuilder.SetEntryPoint(methodBuilder1, PEFileKinds.WindowApplication)
    assemblyBuilder.Save("SamAsm.exe")
End Sub

最佳答案

Sub 返回时,您必须确保堆栈为空。/void功能。

Show -方法返回 DialogResult ,所以你必须调用 Pop 删除 DialogResult从堆栈中。

...
ilGenerator.EmitCall(OpCodes.Call, GetType(System.Windows.Forms.MessageBox).GetMethod("Show", {GetType(String)}), {GetType(String)})
ilGenerator.Emit(OpCodes.Pop) ' remove the return value of Show from the stack
ilGenerator.Emit(OpCodes.Ret)
...

尽管如此,您始终可以使用 peverify跟踪动态创建的程序集中的错误。

因此,在您的情况下,在 SamAsm.exe 上运行 peverify会给你以下错误:

[IL]: Error: [c:\yourpath\SamAsm.exe : SamAsmType::Main][offset 0x0000000A] Stack must be empty on return from a void function. 1 Error(s) Verifying SamAsm.exe

关于vb.net - 使用 System.Reflection.Emit 在 Windows.Forms 中显示 MessageBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13683920/

相关文章:

c# - 其中 T : class to VB

页面回发时javascript输入字段被清除

java - 在 Java 中,当方法具有基类作为参数时,使用反射调用方法无法找到方法

function - 通用顶级功能引用

.net - 有关 InvalidProgramException 的帮助(无效的 IL 代码?)

c# - Mono.Cecil 中的 If/else 和 while 分支

vb.net - 使 FlowLayoutPanel 具有透明背景

vb.net - 如何在 VB.NET 中填充组合框

c - 获取 C 结构成员列表

c# - 如何在运行时向方法添加属性?