С# указатель функции?
У меня проблема с С#, я бы хотел получить указатель на метод в моем коде, но это кажется невозможным. Мне нужен указатель метода, потому что я не хочу использовать его с помощью WriteProcessMemory. Как мне получить указатель?
Пример кода
main()
{
function1();
function2();
}
function1()
{
//get function2 pointer
//use WPM to nop it (I know how, this is not the problem)
}
function2()
{
Writeline("bla"); //this will never happen because I added a no-op.
}
Ответы
Ответ 1
РЕДАКТИРОВАТЬ: я неправильно прочитал ваш вопрос и не увидел бит о желании сделать 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) {
Console.WriteLine(x);
}
Ответ 2
Я знаю, что это очень старый, но пример чего-то вроде указателя функции в С# будет таким:
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;
Затем для вызова исходной функции
myPointer();
myPointer2();
Если у вас есть аргументы для ваших методов, то это так же просто, как добавление общих аргументов в ваше действие:
Action<string> doItWithAString = null;
doItWithAString = temp.DoSomethingWithAString;
doItWithAString("help me");
Или, если вам нужно вернуть значение:
Func<string, bool> getACat = null;
getACat = temp.GetANewCat;
var gotIt = getACat("help me");
Ответ 3
public string myFunction(string name)
{
return "Hello " + name;
}
public string functionPointerExample(Func<string,string> myFunction)
{
myFunction("Theron");
}
Func functionName.. используйте это, чтобы передавать методы. В этом контексте нет смысла, но в основном, как вы его используете.
Ответ 4
Я бы хотел, чтобы это было полезно
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");
}
}
Ответ 5
Перезапись метода не может быть выполнена непосредственно из управляемого кода, однако для этого можно использовать неуправляемый профилирование .net.net.net. См. эту статью msdn, например, о том, как ее использовать.