2012-03-17 45 views
17

Tôi đang gặp sự cố với C#, tôi muốn có một con trỏ của một phương thức trong mã của tôi, nhưng có vẻ như không thể. Tôi cần con trỏ của phương thức vì tôi muốn no-op nó bằng cách sử dụng WriteProcessMemory. Làm thế nào tôi sẽ có được con trỏ?C# con trỏ chức năng?

Ví dụ mã

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

Đó không phải là mã C# hợp lệ. bạn đang cố làm gì vậy? – gdoron

+4

có vẻ tương tự (rất) đối với câu hỏi này [ở đây] (http://stackoverflow.com/questions/2550218/how-to-store-a-function-pointer-in-c-sharp). nó cũng có thể giúp bạn. –

+1

Bạn đang tiếp cận vấn đề theo cách hoàn toàn sai. Tại sao bạn muốn no-op phương pháp? Bạn có thể làm điều đó - nhưng khác, tùy thuộc vào mã gọi của bạn. –

Trả lời

19

EDIT: Tôi hiểu sai câu hỏi của bạn và không thấy chút thông tin về muốn NOP một tuyên bố với làm thao tác bộ nhớ thô. Tôi sợ điều này không được khuyến khích bởi vì, như Raymond Chen nói, GC di chuyển các thứ xung quanh trong bộ nhớ (do đó từ khóa 'được ghim' trong C#). Bạn có thể làm điều đó với sự phản chiếu, nhưng câu hỏi của bạn cho thấy bạn không nắm bắt mạnh mẽ CLR. Dù sao, trở lại câu trả lời không liên quan ban đầu của tôi (mà tôi nghĩ rằng bạn chỉ muốn thông tin về cách sử dụng các đại biểu):

C# không phải là một ngôn ngữ kịch bản;)

Dù sao, C# (và CLR) có " con trỏ hàm "- ngoại trừ chúng được gọi là" đại biểu "và được nhập mạnh, có nghĩa là bạn cần phải xác định chữ ký của hàm ngoài chức năng bạn muốn gọi.

Trong trường hợp của bạn, bạn muốn có một cái gì đó như thế này:

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); 
} 
+0

Bạn _can_ nop nó (sortove). Tạo một 'Function3' không có phần thân và thay đổi delegate thành' Function3' và có 'Main' gọi delegate. –

2

tôi muốn nó rất hữu ích

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

Viết lại một phương pháp không thể được thực hiện trực tiếp từ mã được quản lý, tuy nhiên uniaged .net profi api có thể được sử dụng để làm điều này. Xem bài viết this msdn ví dụ về cách sử dụng nó.

18

Tôi biết điều này là rất cũ, nhưng một ví dụ về một cái gì đó giống như một con trỏ hàm trong C# sẽ là như thế này:

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

... và sau đó ở bạn chính hoặc bất cứ nơi nào:

var temp = new Temp(); 
Action myPointer = null, myPointer2 = null; 
myPointer = temp.DoSomething; 
myPointer2 = temp.DoSomethingElse; 

sau đó, để gọi hàm gốc,

myPointer(); 
myPointer2(); 

Nếu bạn có lập luận cho phương pháp của bạn, sau đó nó đơn giản như thêm lập luận tổng quát để hành động của bạn:

Action<string> doItWithAString = null; 
doItWithAString = temp.DoSomethingWithAString; 

doItWithAString("help me"); 

Hoặc nếu bạn cần phải trả lại một giá trị:

Func<string, bool> getACat = null; 
getACat = temp.GetANewCat; 

var gotIt = getACat("help me"); 
+1

Wow, câu trả lời tuyệt vời. Có lẽ không cụ thể cho câu hỏi này, nhưng tôi đã học được điều gì đó và nó giải quyết được vấn đề của tôi. – pelesl

+0

+1 Câu trả lời hay nhất! Cảm ơn bạn đã chia sẻ các ví dụ cho mỗi kịch bản (void -> void, args -> void, args -> return) – bigp

9
public string myFunction(string name) 
{ 
    return "Hello " + name; 
} 

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

Func functionName .. sử dụng để vượt qua phương pháp xung quanh. Làm cho không có ý nghĩa trong bối cảnh này, nhưng đó là cơ bản cách bạn sẽ sử dụng nó

+1

Đây phải là câu trả lời được chấp nhận mới. – Roman

Các vấn đề liên quan