Подтвердить что ты не робот

С# указатель функции?

У меня проблема с С#, я бы хотел получить указатель на метод в моем коде, но это кажется невозможным. Мне нужен указатель метода, потому что я не хочу использовать его с помощью 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.
}
4b9b3361

Ответ 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, например, о том, как ее использовать.