الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما هي تقنية الانعكاس ؟؟

مغلق
بدأه الكوندور في 15 يونيو 2003 · 5 رد · 1,565 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله

أريد أن استفسر من الأخوة المبرمجين بلغة #C عن بعض التقنيات التي سمعتها عن هذه اللغة..

وأرجو أن أجد عندكم الجواب

سمعت عن تقنية في هذه اللغة الجديدة تتدعى "الانعكاس" (Reflection) ... لكني لم أفهم تماماً ما هي أهمية هذه

التقنية ؟؟!!

وما مجالات استعمالها ... إن كنت كمبرمج أو كمستثمر للنظام .. ؟؟!

و أيضاً أرغب في الاستفسار ماهي التجمعات (assemblies)، وما هي أيضاً البيانات(manifests)

والتي هي كما سمعت من المكونات الجوهرية لخفايا نظام #C

وهل صحيح أن البرنامج المكتوب بلغة السي شارب والمحول إلى ملف تنفيذي (.exe)

يمكن إعادته إلى كود اللغة كما تم برمجته ...

أتمنى لو يعرف أحد الأعضاء عن هذه التقنية جيداً ويشرح لنا عنها ...

ولا مانع من أن يخبرنا أي عضو عن معلوماته حول هذه الاستفسارات ..

وجزاكم الله خيراً

وشكراً

الكــــونـــــــــــــــــــــــــدور

#2

انا سوف احاول ان اجيب على جزء من الاسئلة

بالنسبة للبرنامج عندما يترجم من لغة سي شارب او اية لغة .نت اخرى فهو يترجم الى MSIL لغة الالة الخاصة بمايكروسوفت، او تسمى ايضا "لغة مايكروسوفت الوسطى"، البرنامج في هذه الحالة مترجم الى لغة قريب من لغة الالة ولكنها ليست لغة الالة الخاصة بمعالجات انتل، و يترجم كليا الى لغة الالة لحظة التشغيل اول مرة او لحظة التثبيت Setup لو استخدمت الامر ngen.exe .

البرنامج يترجم الى جزئين، الكود المطلوب تنفيذه و هو الكود بلغة MSIL و الموارد التي قد يستخدمها الكود، مثل الايقونات و بعض الصور التي قد تكون بداخل البرنامج و امور اخرى، كل تلك الامور تسمى metadata ، الجزئين يحفظان معا في ملف EXE او ملف DLL ، الاسم الذي يطلق على تلك الملفات الجديدة هو assemblies

تلك الملفات قد بتدوا ملفات exe او dll عادية ولكنها تختلف ببنيتها الداخلية عن الملفات العادية حيث انها تحتوي على كود MSIL اضافة لبعض الامور الاخرى التي تميزها.

بالنسبة لل metadata الموارد التي بداخل ملف ال exe هناك جزء منها يتحدث عن ملف ال exe نفسه، المعلومات الاساسية او الخصائص الاساسية لذلك الملف، تلك الخصائص تسمى manifest، من انواع هذه الخصائص مثل اخبار البرنامج التنفيذي باستخدام النسخة 6 من مكتبات مايكروسوفت لسطح المكتب مقابل النسخة 5 التي تستخدم افتراضيا، النسخة 6 من تلك المكتبات سوف تجعل البرنامج بشكل برامج ال Windows XP (من ناحية ازرار و ما الى ذلك) ، بالطبع هذه احد الخصائص فقط، جميعها معا تسمى manifest و هي جزء من ال metadata و التي هي جزء من ال assemblies و التي هي قطعة الكود التنفيذي.

الان بالنسبة لموضوع البرامج التي تم برمجتها بسي شارب و اعادتها الى الكود المصدر الخاص بها، عمليا اية لغة برمجة تترجم برنامج الى لغة الالة يمكن بناء برنامج يعكس تلك العملية ليرجع كود مصدر شبيه بالكود المصدر الاصلي، و ذلك يشمل لغات مثل Visual Basic و C++ و جافا و Delphi و باقي اللغات، العملية تسمى Decompile و هناك في انترنت Decompilers للغات مختلفة قادرة على ارجاع الكود الى حالته الاصلية بصورة مختلفة

فلغة الالة ليست لغة سرية، هي عبارة عن اوامر يمكن قرائتها و فهمها، ملفات ال EXE يمكن فتحها بواسطة اية برنامج Debug و النظر بداخلها، و محاولة فهم الكود، المشكلة ان كود لغة الالة هو عبارة عن تحريك قطاعات في الذاكرة ، طريقة البرمجة هناك تختلف ، لذلك فهم تلك الملفات يقتصر على عدد قليل من المبرمجين، ولكنها في النهاية ليست سرية

الاختلاف مع سي شارب و .نت انهم مواصفات قياسية، اي ان كل شيئ مفصل عنها في انترنت، قد يستغرق الامر بالنسبة لبعض الافراد لبناء Decompiler للغة ما اعوام، لان الامور الاساسية التي تتعلق باللغات التي تنتجها الشركات تعتبر اسرار لتلك الشركات، ولكن بما ان سي شارب قياسية و MSIL قياسية و مشروحة بادق التفاصيل، نتيجة لذلك ظهرت Decompilers بصورة سريعة جدا، احدها بني من مبرمج واحد فقط

المشكلة الثانية ان ال Compiler مبني بداخل كائنات سي شارب و .نت و هناك كائنات عديدة اخرى مساعدة، جميعها عندما تجمع معا تصبح عملية ارجاع البرنامج الى كوده الاصلي اكثر سهولة.

بالطبع الارجاع ليس مطابق، يعني اسماء المتغيرات قد تختلف و بعض الاسماء الاخرى الداخلية قد تختلف، ولكنه قريب، نفس المشكلة تعاني منها شركة IBM اليوم بالمناسبة مع النسخ الاحدث من جافا

في VS.NET 2003 هناك برنامج اضافي (يمكن تثبيته مع VS2003) يقوم بتغيرات بسيطة في ملف ال EXE بحيث تعقد تلك التغيرات امكانية ال Decompile ، قد تعقدها لفترة ما الى ان تقوم مجموعة اخرى من المبرمجين بعمل Decompiler جديد و هكذا، تبقى العملية حلقة

للبحث عن Decompilers هذه وصلة بحث في google

http://www.google.com/search?hl=en&ie=UTF-...decompiler+c%23

#3

ال Reflection على حسب علمي مصطلح يطلق على عملية التعامل مع ال metadata الخاصة بال assemblies (هذا اذا لم اكن مخطئ)

انا صراحة في البرمجة اقصى حد استخدمته من ال Reflection هو ال Attributes اي خصائص الاوامر كما باسميها انا، فكرتها هي ان تعطي خصائص ما لقطعة كود، تلك الخصائص قد تستخدمها قطعة كود اخرى تتصل بقطعة الكود الاصلية

يعني على سبيل المثال اذا صنعت زر من نوع جديد، و حفظت الزر في مكتبة DLL و وزعته، الان الزر يفترض ان يكون له خصائص، مثل الخاصية التي تحفظ اللون مثلا، لو استخدمت الزر في Visual Studio.NET اثناء البرمجة سوف تظهر جميع الخصائص الخاصة بالزر في الطرف الايمن في مستكشف الخصائص، ولكن ماذا لو اردنا بان لا تظهر احدهم؟ او ماذا لو اردنا اضافة شرح او tooltip يظهر مع خاصية اللون مثلا، كل هذه الامور يمكن اضافتها ك Attribute للامر او الخاصية المعينة و هي صراحة لن تنفذ من قبل الزر ولكن VS.NET سوف يستخدمها ليتعرف اكثر على الزر نفسه.

شيئ مثل

public class Abc

{

    [Description("test")]

    public string p1

    {

          get {.....}

          set {.....}

    }

}

اذا انتبهت لقطعة الكود السابقة الخاصية p1 لها attribute بالاسم Description و الذي هو في الحقيقة property اي خاصية للكود، ولكن لعدم تخربط المبرمجين بدل اسمه و سمي attribute ، حتى لا تصبح العملية خصائص الخصائص :D

استخداماتها كثيرة، انا لما بنيت مكتبة صغيرة ل .نت استخدمتها لاخبر VS.NET كيف يعالج المكتبة في حالة ال Design Time ، مبرمجي الشبكات يمكنهم استخدامها ايضا ليضعوا صلاحيات مختلفة للاوامر التي بداخل الكود بحيث يتمكن المستخدم من تشغيل او عدم تشغيل قطعة كود داخلية بنائا على صلاحيات ما، و ما الى ذلك

هيا معقد قليلا في البداية ولكن مع الوقت سوف تجد نفسك بتستخدمها من وقت لاخر لاشعوريا

السابق هو جزء من ال Reflection فقط :D

#4

شكر جزيلاً لك أخ خضر على الرد

وجزاك الله خيراً

#5

الــAttributes جزء مهم جدا وقد يفرد له مساحات كبيرة لتعداد استخداماتها..

ليس فقط هنالك الـAttributes الجاهزة من مكتبات دوت نيت، كالـ[DllImport] والـ[serialiazable] أو الـ [securityPermission] بل هناك أيضا إمكانية لإنشاء وحدلت Attributes خاصة بالمبرمج، وفي هذه الحالة تظهر قوة هذه الخاصية بشكل منقطع النظير، حيث يمكنك أن تحدد خواص معينة في مستوى الكود. هو موضوع كبير وقد يصعب شرحه بلغة مبسطة..

بالنسبة لي شخصيا وجدت أهمية كبيرة في التعامل مع إحدى الخواص الموجودة في System.Reflection ألا وهي الـ Dynamic Invokation حيث يمكنك أن تستدعي دالة في إحدى الـclasses من خلال تحديد النوع واسم الدالة، تأمل معي هذه المقطوعة الكودية:

using System;

using System.Reflection;
namespace DynInvoke
{
	class Entry
	{
		[STAThread]
		static void Main(string[] args)
		{
			//Get the type of the target object class
			Type myType = typeof(Target);
			//Dynamically create an instance of the type we got 
			object obj = Activator.CreateInstance(myType);
			//Encapsulate a dynamic copy of the targetted method information
			MethodInfo methInf = myType.GetMethod("GreetThisGuy");
			Console.WriteLine("Type your name and press enter..");
			string myName = Console.ReadLine();
			//Dynamically invoke the function on the target
			//Invoke takes an instance of the target object and
			//an array of objects caontaining the parameters to pass
			string greeting = methInf.Invoke(obj,new object[]{myName});
			Console.WriteLine(greeting);
			Console.ReadLine();
		}
	}

	class Target
	{
		public Target()
		{
		}
		//This function will be the target for dynamic invokation
		public string GreetThisGuy(string name)
		{
			return "Hello "+name+" using Dynamic Invokation";
		}
	}
}

قد يبدو الموضوع للوهلة الأولى مملا ولا جدوى منه، ولكنه في الحقيقة مهم جدا، لقد بنينت نظاما كاملا يستفيد من الـDynamic Invokation ووضعته في العديد من البرامج التي ننتجها وأثبت كفاءة في حدود المطلوب وأكثر.

بإمكانك الإستزادة حيث يوجد فصل مجاني من كتاب Programming c#l موجود على موقع oreilly. وللصدفة الخيرة، فهذا الفصل مخصص بالكامل للـReflection ويحتوي على عديد الأمثلة.

#6

شكراً جزيلاً لك أخ

BAZRAMIT

والله يعطيك العافية

سوف أقوم بتحميل هذا الفصل وقراءته..

مشكور جداً

تحياتي

الكوندور

هذا الموضوع مغلق.

مواضيع مشابهة