Я пытаюсь создать свой собственный язык программирования игрушек для CIL, используя IL Reflection для генерации exes, но когда Im вызывает метод, я просто не работаю.IL Call with Method from string
Я использую System.Reflection.ILGenerator.Emit(OpCodes.Call, MethodInfo)
.
При получении MethodInfo
из Type
нечестным путем использования typeof(something)
, он отлично работает, вызов передается через и он работает, но когда я получаю Type
с функцией Type.GetType(string)
, по какой-то причине он не будет генерировать IL, я проверил и обнаружил, что typeof == Type.GetType
(нет разницы в результатах при проверке с помощью оператора ==
).
Я огляделся, но, похоже, не нашел никакого решения, может ли кто-нибудь сказать мне, что происходит?
EDIT: here is a link to the git repo file
Код:
//Create IL Generator and standard stuff before this...
ilGenerator.Emit(OpCodes.Ldstr, "hello world"); //Push argument(s)
MethodInfo method = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) });
MethodInfo rmethod = Type.GetType("System.Console").GetMethod("WriteLine", new Type[] { typeof(string) });
if(method == rmethod)
{
Console.WriteLine("MATCH!"); //This fires so I know they match
}
ilGenerator.Emit(OpCodes.Call, method); //This works
ilGenerator.Emit(OpCodes.Call, rmethod); //This does not... (no exceptions, but no code is generated looking with ILSpy afterwards)
Опубликовать полный код динамического метода. как вы проходите аргумент и т. д. –
там, не видите, что такое различие, но аргументы выдаются отлично. – Northcode
Это невозможно объяснить. Кроме того, что Type.GetType() следует только вызывать с * полностью квалифицированным именем типа *. Если вы дадите частичное имя, например «System.Console», тогда могут произойти несчастные случаи. –