Указатель на функцию си шарп

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

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

Затем для вызова исходной функции

Читайте также:  Convert object to stream java

Если у вас есть аргументы для ваших методов, то это так же просто, как добавление общих аргументов в ваше действие:

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. Надо написать функцию.

Эксперт .NET

Лучший ответ

Сообщение было отмечено Пытливый Ум как решение

Решение

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; } }

Эксперт .NET

ЦитатаСообщение от Пытливый Ум Посмотреть сообщение

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(); } } }

Источник

Оцените статью