С# указатель функции?
У меня проблема с С#, я бы хотел получить указатель на метод в моем коде, но это кажется невозможным. Мне нужен указатель метода, потому что я не хочу использовать его с помощью WriteProcessMemory. Как мне получить указатель?
РЕДАКТИРОВАТЬ: я неправильно прочитал ваш вопрос и не увидел бит о желании сделать NOP-выражение с помощью необработанных манипуляций с памятью. Боюсь, это не рекомендуется, потому что, как говорит Раймонд Чен, GC перемещает вещи вокруг в памяти (отсюда ключевое слово “закреплено” на С#). Вероятно, вы можете сделать это с отражением, но ваш вопрос подсказывает, что вы не очень хорошо разбираетесь в CLR. Во всяком случае, вернемся к моему оригинальному нерелевантному ответу (где я думал, что вам просто нужна информация о том, как использовать делегатов):
С# не является языком сценариев;)
В любом случае, С# (и CLR) имеет “указатели на функции”, за исключением того, что они называются “делегатами” и строго типизированы, что означает, что вам нужно определить подпись функции в дополнение к функции, которую вы хотите вызвать.
В вашем случае у вас будет что-то вроде этого:
public static void Main(String[] args) < Function1(); >// This is the "type" of the function pointer, known as a "delegate" in .NET. // An instance of this delegate can point to any function that has the same signature (in this case, any function/method that returns void and accepts a single String argument). public delegate void FooBarDelegate(String x); public static void Function1() < // Create a delegate to Function2 FooBarDelegate functionPointer = new FooBarDelegate( Function2 ); // call it functionPointer("bla"); >public static void Function2(String x)
Я знаю, что это очень старый, но пример чего-то вроде указателя функции в С# будет таким:
class Temp < public void DoSomething() <>public void DoSomethingElse() <> public void DoSomethingWithAString(string myString) <> public bool GetANewCat(string name) < return true; >>
… и затем в основном или где угодно:
var temp = new Temp(); Action myPointer = null, myPointer2 = null; myPointer = temp.DoSomething; myPointer2 = temp.DoSomethingElse;
Затем для вызова исходной функции
Если у вас есть аргументы для ваших методов, то это так же просто, как добавление общих аргументов в ваше действие:
Action doItWithAString = null; doItWithAString = temp.DoSomethingWithAString; doItWithAString("help me");
Или, если вам нужно вернуть значение:
Func getACat = null; getACat = temp.GetANewCat; var gotIt = getACat("help me");
public string myFunction(string name) < return "Hello " + name; >public string functionPointerExample(Func myFunction)
Func functionName.. используйте это, чтобы передавать методы. В этом контексте нет смысла, но в основном, как вы его используете.
Я бы хотел, чтобы это было полезно
class Program < static void Main(string[] args) < TestPointer test = new TestPointer(); test.function1(); >> class TestPointer < private delegate void fPointer(); // point to every functions that it has void as return value and with no input parameter public void function1() < fPointer point = new fPointer(function2); point(); >private void function2() < Console.WriteLine("Bla"); >>
Перезапись метода не может быть выполнена непосредственно из управляемого кода, однако для этого можно использовать неуправляемый профилирование .net.net.net. См. эту статью msdn, например, о том, как ее использовать.
Указатели на функции
Указатели на функции в C#
Здравствуйте!\n На вход программе подаётся массив в некотором формате, каждый элемент массива -по.
Указатели(ссылки) на функции(методы класса)
Есть ли в C# указатели(ссылки) на функции(методы класса) ? Нужен их массив.
Указатели на массивы. Указатели и функции
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно.
Указатели и массивы. Указатели и функции
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию.
Сообщение было отмечено Пытливый Ум как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13
class MyClass { public Funcint,int,int> p1; static int f1(int iArg1, int iArg2) { return iArg1 + iArg2; } static int f2(int iArg1, int iArg2) { return iArg1 - iArg2; } public MyClass(bool type) { if (type) p1 = f1; else p1 = f2; } }
Сообщение от Пытливый Ум
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Functions { public static int F1(int arg1, int arg2) { return arg1 + arg2; } public static int F2(int arg1, int arg2) { return arg1 - arg2; } } class MyClass { public Funcint, int, int> MyFunc = null; public MyClass(bool _type) { MyFunc = (_type) ? new Funcint, int,int>(Functions.F1) : new Funcint, int, int>(Functions.F2); } } class Program { static void Main(string[] args) { MyClass m1 = new MyClass(true); MyClass m2 = new MyClass(false); int a = 10, b = 8; Console.WriteLine("\n", m1.MyFunc(a, b), m2.MyFunc(a, b)); Console.ReadLine(); } } }