मैं जो करना चाहता हूं वह यह है कि एक C # पद्धति कैसे लागू होती है, जब इसे कहा जाता है, तो मैं इसे कुछ इस तरह लिख सकता हूं:
[Distributed]
public DTask<bool> Solve(int n, DEvent<bool> callback)
{
for (int m = 2; m < n - 1; m += 1)
if (m % n == 0)
return false;
return true;
}
रन-टाइम में, मुझे उन विधियों का विश्लेषण करने में सक्षम होना चाहिए जिनके पास डिस्ट्रीब्यूटेड विशेषता है (जो मैं पहले से ही कर सकता हूं) और फिर फ़ंक्शन निष्पादित होने से पहले और फ़ंक्शन के वापस आने के बाद कोड डालें। इससे भी महत्वपूर्ण बात, मुझे इसे कोड को संशोधित किए बिना सक्षम करने की आवश्यकता है जहां समाधान को कॉल किया जाता है या फ़ंक्शन के प्रारंभ में (संकलन समय पर, रन-टाइम में ऐसा करना उद्देश्य है)।
फिलहाल मैंने इस बिट कोड का प्रयास किया है (मान लें कि टी टाइप है जिसे सॉल्यूशन में संग्रहित किया जाता है, और मी सॉल्यूशन का एक प्रकार है) :
private void WrapMethod(Type t, MethodInfo m)
{
// Generate ILasm for delegate.
byte[] il = typeof(Dpm).GetMethod("ReplacedSolve").GetMethodBody().GetILAsByteArray();
// Pin the bytes in the garbage collection.
GCHandle h = GCHandle.Alloc((object)il, GCHandleType.Pinned);
IntPtr addr = h.AddrOfPinnedObject();
int size = il.Length;
// Swap the method.
MethodRental.SwapMethodBody(t, m.MetadataToken, addr, size, MethodRental.JitImmediate);
}
public DTask<bool> ReplacedSolve(int n, DEvent<bool> callback)
{
Console.WriteLine("This was executed instead!");
return true;
}
हालाँकि, MethodRental.SwapMethodBody केवल डायनेमिक मॉड्यूल पर काम करता है; उन लोगों को नहीं जो पहले ही विधानसभा में संकलित और संग्रहीत किए गए हैं।
इसलिए मैं एक तरीके से SwapMethodBody को प्रभावी ढंग से करने का एक तरीका खोज रहा हूं जो पहले से ही भरी हुई और निष्पादित विधानसभा में संग्रहीत है ।
ध्यान दें, यह एक समस्या नहीं है अगर मुझे पूरी तरह से डायनेमिक मॉड्यूल में विधि को कॉपी करना है, लेकिन इस मामले में मुझे आईएल भर में कॉपी करने का एक तरीका खोजने की आवश्यकता है और साथ ही सभी कॉल को हल करने के लिए अपडेट करें (जैसे कि वे नई प्रति को इंगित करेगा।