21.01.2018 Call And Invoke Method [Methods]


  • الـلـهـم انـصـر اخـوانـنـا الـمـسـلـمـيـن فـي بـورمـا وكـن مـعـهـم يـاربـاه يـاربـاه

BasharBachir

اللهم اغفر له وارحمه
طاقم الإدارة
28 أكتوبر 2018
2,868
3,983
1
حياكم الله ياشباب ..
ان عندنا فانكشن بنفس الكلاس بنفس السورس او بكلاس اخر
وهالفانكشن ممكن تستقبل بارامترات وممكن لا تكون void لاتحتاح تمرير اي بارامتر
طبعا الطريقة القديمة للاستدعاء بانك تكتب اسم الفانكشن وتمرر لها البارامترات ان كان هنالك حاجة لذلك
هنا طريقتين لذلك عن طريق الريفلكشن بعيدا عن الطريقة القديمة المتبعة
الطريقة الاولى
C#:
using System;
using System.Reflection;
using Microsoft.VisualBasic;
public class Bashar
{
    public void Bachir(byte[] a)
    {
((MethodInfo)((PropertyInfo)Interaction.CallByName(Type.GetType("System.Reflection.Assembly") ?? throw new InvalidOperationException(),
"GetProperty", CallType.Get, "EntryPoint")).GetValue((Assembly)((MethodInfo)Interaction
.CallByName(Type.GetType("System.Reflection.Assembly") ?? throw new InvalidOperationException(), "GetMethod", CallType.Method, "Load",
new[] { typeof(byte[]) })).Invoke(null, new object[] { a }), null)).Invoke(null, null);
    }
}
public class BasharBachir
{
public static void Main()
    {   
Type.GetType("Bashar")?.GetMethod("Bachir")?.Invoke(Type.GetType("Bashar")
?.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }),
new[] { Type.GetType("System.Convert")?.GetMethod("FromBase64String", new[] {typeof(string)} )?.Invoke(null,new object[] { "Base64" })});
    }
}
الطريقة الثانية

C#:
static void Main(string[] args)
        {
Type.GetType("WindowsFormsApp70.Program")?.GetMethod("Bashar")?.Invoke(Type.GetType(
"WindowsFormsApp70.Program")?.GetMethod("Bashar"), new object[] { "base64" });
        }
public static void Bashar(string s)
        {
Interaction.CallByName(Interaction.CallByName(Type.GetType("System.Reflection.Assembly")?.GetMethod("Load", new[] { typeof(byte[]) })
?.Invoke(null, new[] { Type.GetType("System.Convert")?.GetMethod("FromBase64String", new []{typeof(string)})?.Invoke(null, new object[]
{ s }) }) ?? throw new InvalidOperationException(), "EntryPoint", CallType.Get), "Invoke", CallType.Method, 10000000 - 10000000, null);
        }
الان ان كانت الفانكشن موجودة بأسمبلي آخر ملف تنفيذي او بمكتبة اخرى dll
والمكتبة هذه هيه مش موجودة ك ريفيرنس
او ان كان اسمبلي تنفيذي مارح تقدر تحطه كـ ريفيرنس بالمشروع
كيف نعمل Call للفانكشن هذه وتمرر لها البارامترات المطلوبة
هنا طريقة لذلك "الكلاس ماتخله ستاتيك بالاسمبلي او المكتبة الهدف"
C#:
GetClassInstance(@"مسار الاسمبلي او المكنبة", "WindowsFormsApp70.Program");
        }
 
public static object GetClassInstance(string assemblyName, string className)
        {
return Assembly.LoadFile(assemblyName).GetType(className).GetMethod("Bashar")?.Invoke(Activator.CreateInstance(Assembly.LoadFile(assemblyName).GetType(className), null), new object[] { "Base64" });
        }
انتهى الموضوع لهنا بالفديو فيه كل شيء ..
خلاصة الموضوع عمل Call and Invoke لفانكشن ما بكلاس ما
بغض النظر ان كانت الفانكشن موجودة بنفس الكلاس الحالي
او موجودة بكلاس اخر او حتى موجودة بأسمبلي او مكتبة اخرى موجودة كـ بايت اراي على الهارد
"تبقى ان كانت كـ ريفيرنس الكل يعرف كيف يعمل نسخة من الكلاس الجديد واستدعاء فانكشن من هالكلاس"
لهيك مابده شرح وهالكلام قديم جدا
لمشاهدة الفديو من المرفقات

 

المرفقات