Я использую Reflection и ilGenerator для создания .Exe, который вызывает метод из DLL.
Моя проблема в том, что когда это метод экземпляра, я должен поместить экземпляр в стек перед вызовом метода. Поэтому у меня есть метод на С#, который создает и возвращает этот экземпляр. Он бросает System.MethodAccessException
.
Мой вопрос в том, возможно ли это вообще? Как это работает? Делая это в IL, il.Emit(Opcodes.call, methodInfo)
, в вызове, который создает .exe, во время выполнения, как он узнает, какой метод вызывать? Идет ли метод, который я хочу вызвать, в сборку .exe? Я очень смущен этим.
Я иду в DLL, получаю тип, получаю MethodInfo
, который я хочу вызвать. Я создаю новый Assembly->AssemblyBuilder->ModuleBuilder->TypeBuilder. Этот новый тип, который я создаю, расширяет Type из DLL:
TypeBuilder tb = mb.DefineType("TypeApp" + typeName, baseType.Attributes, DLLType);
Я создаю MethodBuilder
как точку входа нового типа:
MethodBuilder metb = tb.DefineMethod("Main", MethodAttributes.Public |
MethodAttributes.Static, typeof(void), argsArray);
ab.SetEntryPoint(metb);
Затем я генерирую IL для метода Main
:
ILGenerator il = metb.GetILGenerator();
il.Emit(OpCodes.Call, callcreateInstanceMethodInfo);
Ил продолжается, но я пока не до конца в этом разбираюсь...
Затем я создаю .exe
tb.CreateType();
ab.Save(typeName + methodName + ".exe");
MethodAccessException
? Мне трудно следить за описанием в вопросе. - person Jon Hanna   schedule 28.10.2015