पर किसी विधि में आईएल इंजेक्ट करने के लिए कैसे शीर्षक कम या ज्यादा कहता है। this लेख के आधार पर, मैं इस के साथ आ गया है:रनटाइम
public static unsafe void Replace(this MethodBase destination, MethodBase source)
{
IntPtr srcHandle = source.MethodHandle.GetFunctionPointer();
IntPtr dstHandle = destination.MethodHandle.GetFunctionPointer();
int* dstPtr = (int*)dstHandle.ToPointer();
*dstPtr = srcHandle.ToInt32();
}
यह वास्तव में काम करता है ... कभी कभी -.-
उदाहरण के लिए, इस काम करता है।
public static class Program
{
public static void Main(string[] args)
{
MethodInfo methodA = typeof(Program).GetMethod("A", BindingFlags.Public | BindingFlags.Static);
MethodInfo methodB = typeof(Program).GetMethod("B", BindingFlags.Public | BindingFlags.Static);
methodA.Replace(methodB);
A();
B();
}
public static void A()
{
Console.WriteLine("Hai World");
}
public static void B()
{
Console.WriteLine("Bai World");
}
}
हालांकि, यह (SEHException) नहीं है। मैंने जो कुछ किया वह कार्य बदल गया था जिसमें कार्यों को परिभाषित किया गया था।
public static class Program
{
public static void Main(string[] args)
{
MethodInfo methodA = typeof(Program).GetMethod("A", BindingFlags.Public | BindingFlags.Static);
MethodInfo methodB = typeof(Program).GetMethod("B", BindingFlags.Public | BindingFlags.Static);
methodA.Replace(methodB);
A();
B();
}
public static void B()
{
Console.WriteLine("Bai World");
}
public static void A()
{
Console.WriteLine("Hai World");
}
}
लेख में कोड के लिए ... मैं इसे बिल्कुल काम नहीं कर सका।
कोई विचार/विकल्प?
आप ऐसा क्यों करना चाहते हैं? यह एक भयानक विचार की तरह लगता है। – Amy
चिंता न करें - कुछ भी दुर्भावनापूर्ण नहीं है। सिर्फ ज्ञान के लिए: डी – YellPika
मेरा मानना है कि ऐसा करने का एकमात्र सुरक्षित तरीका असेंबली लोड होने से पहले कोड को इंजेक्ट करना है। – porges