Reflection.Emit-Namespace를 사용하여 런타임시 .NET 유형을 디자인하고 있습니다..NET에서 Reflection.Emit을 사용하여 하드 코딩 된 기존 메서드 호출
Dim AssemblyBuilder As AssemblyBuilder = Nothing
Dim ModuleBuilder As ModuleBuilder = Nothing
Dim TypeBuilder As TypeBuilder = Nothing
Dim MethodBuilder As MethodBuilder
Dim ReturnType As Type = Nothing
AssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(New AssemblyName("DynamicAssembly"), AssemblyBuilderAccess.RunAndSave)
ModuleBuilder = AssemblyBuilder.DefineDynamicModule("DynamicAsssembly", "DynamicAssembly.dll")
TypeBuilder = ModuleBuilder.DefineType("DynamicType")
MethodBuilder = TypeBuilder.DefineMethod("Do", MethodAttributes.Public, Nothing, Nothing)
위 작품 : 현재, 나는 생성 클래스에 이미 존재하는 메소드를 호출하는 방법을 생성하려고 해요.
MethodBuilder.GetILGenerator.EmitCall(OpCodes.Call, Me.GetType.GetMethod("DisplayString"), Nothing)
MethodBuilder.GetILGenerator.Emit(OpCodes.Ret)
ReturnType = TypeBuilder.CreateType()
Activator.CreateInstance(ReturnType)
일반적으로 다음과 같이하고 싶습니다. 실행중인 클래스 자체에있는 메소드를 호출합니다. 그러나 다음을 호출 할 때 예외가 발생합니다.
ReturnType.GetMethod("Do").Invoke(Activator.CreateInstance(ReturnType), Nothing)
내부 예외는 다음과 같습니다. InvalidProgramException, "공용 언어 런타임에서 잘못된 프로그램을 발견했습니다."
예를 들어 전화를 발신 한 위의 행을 바꾸면
MethodBuilder.GetILGenerator.Emit(OpCodes.Ldstr, "test")
MethodBuilder.GetILGenerator.EmitCall(OpCodes.Call, GetType(System.Windows.Forms.MessageBox).GetMethod("Show", {GetType(String)}), {GetType(String)})
MethodBuilder.GetILGenerator.Emit(OpCodes.Pop)
잘 작동합니다.
실행중인 어셈블리 유형과 해당 멤버에 액세스 할 수 없기 때문에 문제가 발생한다고 생각합니다. 그렇지만 실행하기 위해 변경할 수있는 항목은 무엇입니까?
감사
모모
'DisplayString' 메소드의 서명은 무엇입니까? – svick