2011-05-29 7 views
11

सी ++ में मुझे फ़ंक्शन का पता मिलेगा और मेरे फ़ंक्शन में पहले कुछ बाइट्स को एक jmp पर ओवरराइट करेगा, कुछ चीज़ें करें, मूल बाइट्स को पुनर्स्थापित करें, और मूल फ़ंक्शन को कॉल करें।क्या सी # में एक प्रबंधित फ़ंक्शन को हुक करने का कोई तरीका है जैसे मैं सी ++ में एक अप्रबंधित फ़ंक्शन करता हूं?

क्या मैं सी # में ऐसा कुछ कर सकता हूं?

+0

सवाल काफी दिलचस्प है। लेकिन मुझे नहीं लगता कि एक रास्ता है .. –

उत्तर

0

जिस तकनीक को आप ढूंढ रहे हैं उसे एओपी - आस्पेक्ट ओरिएंटेड प्रोग्रामिंग कहा जाता है। यदि आप थोड़ा गड़बड़ करते हैं तो आप सी # के लिए कई ढांचे को पा सकते हैं।

अद्यतन: Built-in AOP in C# - is it on the way?

+0

मैंने गुमराह किया है और मुझे कुछ भी नहीं मिला, क्या आप मुझे सही दिशा में इंगित कर सकते हैं? – Avery3R

+0

लिंक के साथ अपडेट किया गया। –

+0

इनमें से कोई भी ऐसा नहीं दिखता है जो मैं चाहता हूं, जब भी इसे बुलाया जाता है और अपना कोड चलाता है, तो वैकल्पिक रूप से मूल कोड – Avery3R

2

आप रनटाइम पर हुक करने चाहते हैं या आप द्विआधारी पैच करने के लिए करना चाहते हैं क्या: आप इस सवाल में लिंक के बहुत सारे और जानकारी मिल सकती है?

रनटाइम पर हुक करने के लिए आप की रूपरेखा एपीआई (अपेक्षाकृत कठिन) का उपयोग कर सकते हैं: http://msdn.microsoft.com/en-us/magazine/cc188743.aspx

compiletime पर हुक करने के लिए आप इस तरह के PostSharp के रूप में एक आईएल rewriter, उपयोग कर सकते हैं।

+0

मैं रनटाइम पर हुक करना चाहता हूं, लेकिन प्रोफाइलिंग एपीआई ऐसा लगता है कि यह सी ++ में है, मैं एक सी # सी # – Avery3R

+0

से कार्य समस्याग्रस्त लगता है क्योंकि आप अपने खुद के सी # कोड को संकलित करने के लिए आवश्यक बहुत ही जिटर में हेरफेर कर रहे हैं। शायद एक प्रबंधित रैपर और एकाधिक ऐप डोमेन मदद कर सकते हैं। लेकिन यह सी # के साथ देशी सी/सी ++ मिश्रण करने से अधिक परेशानी की तरह लगता है। – CodesInChaos

7

.NET प्रोफाइलर एपीआई रनटाइम पर अवरोध विधियों का सबसे नज़दीकी "माइक्रोसॉफ्ट-अनुमोदित" तरीका है। जैसा कि पहले ही उल्लेख किया गया है, यह कार्यान्वित करने में कुछ मुश्किल है और मुझे पुस्तकालय से अवगत नहीं है जो पूरी तरह से प्रबंधित कोड का उपयोग करके इसे कार्यान्वित करना आसान बनाता है।

कुछ महीने पहले इस के लिए विकल्पों की खोज करते समय, मैंने CLR Method Injection पर ठोकर खाई, जो स्रोत कोड के साथ एक लेख है जो बताता है कि रनटाइम पर विधियों को कैसे रोकें। मैंने इसे स्वयं इस्तेमाल करने पर विचार किया, और यहां तक ​​कि नमूना प्रोजेक्ट भी काम कर रहा था, लेकिन आखिरकार निष्कर्ष निकाला कि मुझे विधि अवरोध से अधिक की आवश्यकता है और उसे एक अलग समाधान की आवश्यकता होगी। हालांकि, यह दृष्टिकोण सीधे आपके प्रश्न का उत्तर देता है।

अन्त में, मैं क्या AfterthoughtPostSharp को एक खुला स्रोत विकल्प है, जो एक के बाद संकलन कदम के रूप में चलाता है और यदि आप अन्य कोड फोन या विधि कार्यान्वयन पूरी तरह बदलने के लिए मौजूदा तरीकों को संशोधित करने की अनुमति देता है के रूप में विकसित किया गया था कर समाप्त हो गया। मैं एक नया द्रव वाक्य रचना है, जो मैं अब का एक नमूना शामिल होंगे पर अभी काम कर रहा हूँ मदद करने के लिए आप देखते हैं कि कैसे इस AOP दृष्टिकोण अपनी जरूरतों को पूरा करेगा एक उदाहरण प्रदान करने के लिए:

Methods 
    .Named("Sum") 
    .WithParams<int[]>() 
    .Before((T instance, ref int[] values) 
     => { var s = new Stopwatch(); s.Start(); return s; }) 
    .After((instance, stopwatch, values) 
     => instance.Result = (int)stopwatch.ElapsedMilliseconds); 

इस मामले में, जबकि में संशोधन के लिए एक मौजूदा Sum विधि के साथ टाइप करें मैं निष्पादन समय को मापने के लिए विधि से पहले और बाद में कोड प्रस्तुत कर रहा हूं। मूल संकलित वर्ग के खिलाफ आफ्टरथॉट चलाने के बाद, परिणामी Sum विधि में विधि लैब के पहले और बाद में इन लैम्ब्डा अभिव्यक्तियों को कॉल किया जाएगा (सी # कंपाइलर केवल उन्हें स्थिर तरीकों में बदल देता है)। मैं बस Implement कहलाता था और पूरे विधि कार्यान्वयन को बदल सकता था।

मुझे आशा है कि इनमें से एक दृष्टिकोण आपकी आवश्यकताओं को पूरा करेगा। मेरे मामले में, मैं एओपी मार्ग चला गया क्योंकि मैं इंटरफेस को लागू करने, इंटरफेस को लागू करने, नए तरीकों/गुणों आदि को जोड़ने से अधिक करना चाहता था। मुझे कुछ ऐसा भी चाहिए जो रनटाइम पर निर्भरताएं पेश नहीं करेगा या स्थिरता या प्रदर्शन के बारे में चिंताओं को नहीं रनटाइम पर्यावरण - संकलन-समय प्रसंस्करण परीक्षण करने के लिए केवल सुरक्षित और आसान है।

+0

काम करने के बाद क्या काम करेगा यदि मैं जिस फंक्शन को हुक कर रहा हूं वह किसी अन्य असेंबली में है, तो मेरे पास स्रोत कोड नहीं है? – Avery3R

+0

हां। आफ्टरथॉट पोस्टशर्प से थोड़ी अलग तरीके से काम करता है जिसमें यह आपको एक असेंबली में संशोधन (जैसे ऊपर - आपके परिवर्तनों का कोड विवरण) बनाने की अनुमति देता है और इसमें परिवर्तन लागू करने के लिए एक और असेंबली को लक्षित करता है। [लॉगिंग उदाहरण] (https://github.com/vc3/Afterthought/tree/master/Examples/Logging) पर एक नज़र डालें। यह Logging.Amender असेंबली में संशोधन का वर्णन करता है, जिसे बाद में Logging.UnitTest.Target असेंबली पर लागू किया जाता है। इसके बाद आपको आफ्टरथॉट के संदर्भ को स्थापित किए बिना असेंबली को संशोधित करने की अनुमति देने का लाभ भी मिलता है - इसे केवल एक टूल बनाते हैं। –

+0

क्या आफ्टरथॉट .NET प्रोफाइलर अवरोध का उपयोग करता है? मैं एक उपकरण की तलाश में हूं जो ऐसा करता है – orellabac

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