интересует как вернуть назад в методПожалуйста, авторизуйтесь для просмотра ссылки.
интересует как вернуть назад в методПожалуйста, авторизуйтесь для просмотра ссылки.
p.s. а, это .net
GetILAsByteArray() - это не то, о чем ты думаешь. Он копирует в массив только байты самих MSIL-инструкций.
Как выглядит полноценная структура метода:
Существует два типа метода(заголовка):
TINY используется, когда метод < 64 байта, когда нет локальных переменных, а также нет SEH-обработчиков(блоков исключений). В остальных случаях используется FAT.
- "TINY"(использует структуру IMAGE_COR_ILMETHOD_TINY)
- "FAT"(использует структуру IMAGE_COR_ILMETHOD_FAT)
Также у методов в хедере есть флаги.
Дальше у обоих методов идет тело метода ("Instuctions" as "array bytes", как раз то, что ты получаешь при вызове GetILAsByteArray()). Tiny-метод на этом заканчивается.
- TINY - CodeSize
- FAT - Flags(bits), MaxStack, CodeSize, LocalVarSigTok
Но у FAT может быть padding (выравнивание) + SEH Header(флаги обработчика, структура IMAGE_COR_ILMETHOD_SECT_EH) + SEH-body (TryOffset, TryLength, HandlerOffset, HandlerLength)
Всё это ты можешь сделать сам(небольшая идея для шифровки методов , такого ни у кого не будет, кроме тебя))__). Или использоватьПожалуйста, авторизуйтесь для просмотра ссылки., где не нужно заморачиваться.
Как это не доступен? А куда он делся?Пожалуйста, авторизуйтесь для просмотра ссылки.в net 3.5 не доступен (
Проверял у себя на юнити 4 там нету егоКак это не доступен? А куда он делся?
Проект не должен быть на коре. Работает только на фреймворке 4.8 <!
И создавать нужно сначала экземпляр класса, а далее обращаться к нему:
public static Type BuildDynType() {
Type addType = null;
AppDomain currentDom = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyDynamicAssembly";
AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly(
myAsmName,
AssemblyBuilderAccess.RunAndSave);
// The dynamic assembly space has been created. Next, create a module
// within it. The type Point will be reflected into this module.
ModuleBuilder myModuleBldr = myAsmBldr.DefineDynamicModule("MyModule");
TypeBuilder myTypeBldr = myModuleBldr.DefineType("Adder");
MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("DoAdd",
MethodAttributes.Public |
MethodAttributes.Static,
typeof(int),
new Type[]
{typeof(int), typeof(int)});
// Build the array of Bytes holding the MSIL instructions.
byte[] ILcodes = new byte[] {
0x02, /* 02h is the opcode for ldarg.0 */
0x03, /* 03h is the opcode for ldarg.1 */
0x58, /* 58h is the opcode for add */
0x2A /* 2Ah is the opcode for ret */
};
myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length);
addType = myTypeBldr.CreateType();
return addType;
}
а вызвать как не подскажешь?И создавать нужно сначала экземпляр класса, а далее обращаться к нему:
C#:public static Type BuildDynType() { Type addType = null; AppDomain currentDom = Thread.GetDomain(); AssemblyName myAsmName = new AssemblyName(); myAsmName.Name = "MyDynamicAssembly"; AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly( myAsmName, AssemblyBuilderAccess.RunAndSave); // The dynamic assembly space has been created. Next, create a module // within it. The type Point will be reflected into this module. ModuleBuilder myModuleBldr = myAsmBldr.DefineDynamicModule("MyModule"); TypeBuilder myTypeBldr = myModuleBldr.DefineType("Adder"); MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("DoAdd", MethodAttributes.Public | MethodAttributes.Static, typeof(int), new Type[] {typeof(int), typeof(int)}); // Build the array of Bytes holding the MSIL instructions. byte[] ILcodes = new byte[] { 0x02, /* 02h is the opcode for ldarg.0 */ 0x03, /* 03h is the opcode for ldarg.1 */ 0x58, /* 58h is the opcode for add */ 0x2A /* 2Ah is the opcode for ret */ }; myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length); addType = myTypeBldr.CreateType(); return addType; }
Что вызвать? Переделай под себя и всё.а вызвать как не подскажешь?
MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("DoAdd",
MethodAttributes.Public |
MethodAttributes.Static,
typeof(int),
new Type[]
{typeof(int), typeof(int)});
я передал в myMthdBldr var ILcodes = typeof(Bootstrap).GetMethod("Test").GetMethodBody().GetILAsByteArray();Что вызвать? Переделай под себя и всё.
Так сразу делать нельзя: MethodBuilder.CreateMethodBody(ILcodes, ILcodes.Length);
Нужно сначала выделить память(создать инстанс) ->
Далее уже обращаться к myMthdBldr, у которого будет метод CreateMethodBody()C#:MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("DoAdd", MethodAttributes.Public | MethodAttributes.Static, typeof(int), new Type[] {typeof(int), typeof(int)});
В том типе, где создавал метод, вызываешь метод InvokeMember();я передал в myMthdBldr var ILcodes = typeof(Bootstrap).GetMethod("Test").GetMethodBody().GetILAsByteArray();
как мне вызвать myMthdBldr?Через invoke
P.S мне это нужно для вызова методов по типу как в Agile.net
var type = BuildDynType();
var result = type.InvokeMember("DoAdd", // название метода, который создал
BindingFlags.InvokeMethod, // биндинг на вызов
null, // биндер здесь не нужен
type, // тип, в котором метод
new object[] { 3, 5 }); // передача аргументов в метод (должны совпадать типы 1к1)
а что на счет il?что я не правильно передал?В том типе, где создавал метод, вызываешь метод InvokeMember();
Если конкретнее:
C#:var type = BuildDynType(); var result = type.InvokeMember("DoAdd", // название метода, который создал BindingFlags.InvokeMethod, // биндинг на вызов null, // биндер здесь не нужен type, // тип, в котором метод new object[] { 3, 5 }); // передача аргументов в метод (должны совпадать типы 1к1)
Не понимаю что ты хочешь. Конкретный вопрос сформулируй. Если есть ошибка, кидай.
class Program
{
public static void Debug()
{
Console.WriteLine(1);
Console.ReadKey();
}
static void Main(string[] args)
{
var gen = BuildDynType();
var result = gen.InvokeMember("Debug", // название метода, который создал
BindingFlags.InvokeMethod, // биндинг на вызов
null, // биндер здесь не нужен
gen, // тип, в котором метод
null); // передача аргументов в метод (должны совпадать типы 1к1)
}
public static Type BuildDynType()
{
Type addType = null;
AppDomain currentDom = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyDynamicAssembly";
AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly(
myAsmName,
AssemblyBuilderAccess.Run);
// The dynamic assembly space has been created. Next, create a module
// within it. The type Point will be reflected into this module.
ModuleBuilder myModuleBldr = myAsmBldr.DefineDynamicModule("MyModule");
TypeBuilder myTypeBldr = myModuleBldr.DefineType("Program");
MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("Debug",
MethodAttributes.Public |
MethodAttributes.Static,
typeof(int),
new Type[]
{typeof(int), typeof(int)});
// Build the array of Bytes holding the MSIL instructions.
byte[] ILcodes = typeof(Program).GetMethod("Debug").GetMethodBody().GetILAsByteArray();
myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length);
var type = BuildDynType();
return type;
}
}
Посмотреть вложение 140694
C#:class Program { public static void Debug() { Console.WriteLine(1); Console.ReadKey(); } static void Main(string[] args) { var gen = BuildDynType(); var result = gen.InvokeMember("Debug", // название метода, который создал BindingFlags.InvokeMethod, // биндинг на вызов null, // биндер здесь не нужен gen, // тип, в котором метод null); // передача аргументов в метод (должны совпадать типы 1к1) } public static Type BuildDynType() { Type addType = null; AppDomain currentDom = Thread.GetDomain(); AssemblyName myAsmName = new AssemblyName(); myAsmName.Name = "MyDynamicAssembly"; AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly( myAsmName, AssemblyBuilderAccess.Run); // The dynamic assembly space has been created. Next, create a module // within it. The type Point will be reflected into this module. ModuleBuilder myModuleBldr = myAsmBldr.DefineDynamicModule("MyModule"); TypeBuilder myTypeBldr = myModuleBldr.DefineType("Program"); MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("Debug", MethodAttributes.Public | MethodAttributes.Static, typeof(int), new Type[] {typeof(int), typeof(int)}); // Build the array of Bytes holding the MSIL instructions. byte[] ILcodes = typeof(Program).GetMethod("Debug").GetMethodBody().GetILAsByteArray(); myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length); var type = BuildDynType(); return type; } }
не показывалаПосмотреть вложение 140787
Тут скорее твоя невнимательность. Я не думаю, что визулка не подсказала бы тебе о рекурсивном вызове
Посмотреть вложение 140787
Тут скорее твоя невнимательность. Я не думаю, что визулка не подсказала бы тебе о рекурсивном вызове
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz