Указатель функции C #? - PullRequest
24 голосов
/ 18 марта 2012

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

Ответы [ 5 ]

32 голосов
/ 26 февраля 2013

Я знаю, что это очень старый, но пример чего-то вроде указателя на функцию в C # будет выглядеть так:

class Temp 
{
   public void DoSomething() {}
   public void DoSomethingElse() {}
   public void DoSomethingWithAString(string myString) {}
   public bool GetANewCat(string name) { return true; }
}

... и затем в вашем main или в любом месте:

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");
22 голосов
/ 18 марта 2012

РЕДАКТИРОВАТЬ: я неправильно прочитал ваш вопрос и не видел бит о том, чтобы хотеть NOP оператор с помощью необработанных манипуляций с памятью.Боюсь, это не рекомендуется, потому что, как говорит Раймонд Чен, GC перемещает вещи в памяти (отсюда и ключевое слово «закрепленный» в C #).Вы, вероятно, можете сделать это с помощью размышлений, но ваш вопрос говорит о том, что у вас нет четкого понимания CLR.В любом случае, вернемся к моему первоначальному неуместному ответу (где я думал, что вы просто хотели получить информацию об использовании делегатов):

C # не является языком сценариев;)

В любом случае, C # (и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);
}
14 голосов
/ 03 декабря 2013
public string myFunction(string name)
{
    return "Hello " + name;
}

public string functionPointerExample(Func<string,string> myFunction)
{
    myFunction("Theron");
}

Func functionName .. используйте это для передачи методов. Не имеет смысла в этом контексте, но в основном это то, как вы бы это использовали

2 голосов
/ 18 марта 2012

Хотелось бы, чтобы это было полезно

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");
    }
}
1 голос
/ 18 марта 2012

Переписать метод нельзя напрямую из управляемого кода, однако для этого можно использовать неуправляемый API профилирования .net. См. эту статью MSDN, например, о том, как ее использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...