2012-03-17 19 views
17

मुझे सी # के साथ कोई समस्या है, मैं अपने कोड में एक विधि का सूचक प्राप्त करना चाहता हूं, लेकिन यह असंभव प्रतीत होता है। मुझे विधि के सूचक की आवश्यकता है क्योंकि मैं 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

यह मान्य सी # कोड नहीं है। तुम क्या करने की कोशिश कर रहे हो? – gdoron

+4

इस प्रश्न के लिए समान (बहुत) लगता है [यहां] (http://stackoverflow.com/questions/2550218/how-to-store-a-function-pointer-in-c-sharp)। यह आपकी मदद भी कर सकता है। –

+1

आप (पूरी तरह से) गलत तरीके से समस्या का सामना कर रहे हैं। आप विधि को नो-ऑप क्यों नहीं करना चाहते हैं? आप यह कर सकते हैं - लेकिन अलग-अलग, आपके कॉलिंग कोड के आधार पर। –

उत्तर

19

संपादित करें: मैं अपने प्रश्न पढ़ने में भूलना और कच्चे स्मृति में गड़बड़ी कर रही है के साथ एक बयान nop के लिए इच्छुक के बारे में थोड़ा और नहीं देखा। मुझे डर है कि यह अनुशंसित नहीं है क्योंकि, जैसा कि रेमंड चेन कहते हैं, जीसी स्मृति में चारों ओर सामान चलाता है (इसलिए सी # में 'पिन किया गया' कीवर्ड)। आप शायद इसे प्रतिबिंब के साथ कर सकते हैं, लेकिन आपका प्रश्न बताता है कि आपको सीएलआर की मजबूत समझ नहीं है। वैसे भी, वापस अपने मूल अप्रासंगिक जवाब देने के लिए (मैं कहाँ सोचा था कि तुम सिर्फ कैसे प्रतिनिधियों का उपयोग करने के बारे में जानकारी चाहते थे):

सी # एक पटकथा भाषा नहीं है, और)

वैसे भी, सी # (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); 
} 
+0

आप इसे _can_ nop (sortove)। 'फंक्शन 3' बनाएं जिसमें कोई बॉडी न हो और प्रतिनिधि को 'फंक्शन 3' में बदलें और 'मुख्य' प्रतिनिधि को कॉल करें। –

2

काश चाहते हैं यह उपयोगी है

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

एक विधि नए सिरे से लिखना प्रबंधित कोड से सीधे नहीं किया जा सकता, लेकिन, अप्रबंधित .NET प्रोफाइलिंग एपीआई ऐसा करने के लिए उपयोग किया जा सकता है। उदाहरण के लिए this msdn आलेख देखें उदाहरण के लिए इसका उपयोग कैसे करें।

18

मैं जानता हूँ कि यह बहुत पुरानी है, लेकिन सी # में एक समारोह सूचक की तरह कुछ का एक उदाहरण इस तरह होगा:

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"); 
+1

वाह, महान जवाब। शायद इस सवाल के लिए विशिष्ट नहीं है, लेकिन मैंने कुछ सीखा और यह मेरी समस्या हल हो गई। – pelesl

+0

+1 सर्वश्रेष्ठ उत्तर! प्रत्येक परिदृश्य के लिए उदाहरण साझा करने के लिए धन्यवाद (शून्य -> ​​शून्य, तर्क -> शून्य, तर्क -> वापसी) – bigp

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

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

समारोह functionName .. इस का उपयोग तरीकों के आसपास पारित करने के लिए। इस संदर्भ में कोई समझ नहीं आता है लेकिन मूल रूप से आप इसका उपयोग कैसे करेंगे

+1

यह नया स्वीकार्य उत्तर होना चाहिए। – Roman

संबंधित मुद्दे