21-06-18, 07:28 PM
(آخر تعديل لهذه المشاركة : 22-06-18, 12:30 AM {2} بواسطة silverlight.)
مقدمة:
الهدف من هذا الموضوع هو توضيح كيفية استخدام الواجهات Interface في الربط بين ملف Dll و البرنامج الرئيسي
هذه الفكرة تسمح للمبرمج باستخدام الواجهات Interface في اسدعاء الدوال بدون أن يظهر الكود الفعلي في البرنامج الرئيسي
أيضا هذا الأسلوب يسمح للمبرمج بتشقيير ملف او ملفات Dll التي تحتوي علي الكود الفعلي
الكود الفعلي يمكن الاحتفاظ به في صورة مصفوفة بايت في
ملفات داتابيز
أو في ملفات عادية
أو يمكن اضافته الي Resources المشروع الرئيسي
أو يمكن وضغه تحت فهرس معين اثناء عمل Setup للمشروع الرئيسي
ثم يتم قراءة الكود باستخدام Reflection و نسترجع ما يقوم الكود الفعلي بتنفيذه عن طريق استخدام الواجهات Interface
خطوات التنفيذ:
التنفيذ يحتاج الي دراية تامة بكيفية كتابة Interface و كيفية كتابة كلاسات و دوال و روتينات مختلفة و بحرفية تامة
ايضا الموضوع يحتاج الي الصبر من المبرمج حتي يتأكد أن الفكرة يتم كتابتها وإستخدامها يالشكل الصحيج من داخل المشروع الرئيسي
1- يتم بناء مشروع من النوع class library هذا المشروع سيحتوي علي Interface واحد أو أكثر من Interface وهذا طبقا لاحتياج المبرمج
وبعد الانتهاء تماما من هذا المشروع وعمل Build له يتم اضافة نسخة منه الي المشروع الثاني و الثالث وذلك باستخدام Add Reference
2- يتم بناء مشروع ثاني من النوع class library وفي هذا المشروع يتم عمل Implementation للواجهات الموجودة في المشروع الأول وهنا يتم كتابة الكود الفعلي
وبعد الانتهاء تماما من هذا المشروع وبعد عمل build له ممكن أن نقوم بتشفيير الملف او نستخدمه بشكل مباشر في المشروع الرئيسي بحيث نضيفه مثلا الي Resources المشروع الرئيسي و هذا متروك للمبرمج
3- أخيرا المشروع الرئيسي
وفي هذا المشروع نستخدم الواجهات الموجودة في المشروع الأول في استدعاء الدوال من المشروع الثاني و بهذا نضمن أن الكود الفعلي لا يظهر في البرنامج الرئيسي
ملاحظات:
اولا : يجب ان نضع في الاعتبار استخدام مسميات مناسبة وغير مكررة للواجهات و للمشاريع بشكل عام
ثانيا : يجب استخدام نفس Build او نفس version الخاص بالمشروع الأول في المشروعان الثاني و الثالث
الكود:
المشروع الأول
1- نفتح مشروعا جديدا من النوع Class Libraray و نعطيه اسما مناسبا و ليكن مثلا CairoCommon
2- نضيف لهذا المشروع واجهة Interface بإسم مناسب و ليكن مثلا ICairoFunctions
3- نكتب الدوال و الروتينات التي نريدها في الواجهة Interface
4- نقوم بعمل Build للمشروع وهنا سنحصل علي ملف اسمه CairoCommon.dll هذا الملف سنجده تحت الفهرس Debug الخاص بالمشروع الأول
5- ثم نضيف نسخة من هذا المشروع الي المشروع الثاني وتحديدا الي References المشروع الثاني وذلك ياستخدام Add Refreence
6- أخيرا نضيف نسخة من هذا المشروع الي المشروع الرئيسي وتحديدا الي References المشروع الرئيسي وذلك ياستخدام Add Refreence
شكل الكود الخاص بالواجهة ICairoFunctions سيكون كالتالي
أنا فقط أضفت دالة واحدة من أجل المثال و هي دالة سوف تقوم بتحويل مصفوفة من البايت الي String
المشروع الثاني
1- فتح مشروعا جديدا من النوع Class Libraray و نعطيه اسما مناسبا و ليكن مثلا CairoFunctions
2- نضيف للمشروع كلاسا اسمه CairoCommonFunctions
3- نقوم بعمل Imports لفضاء الأسماء الخاصة بالمشروع الأول
4- نقوم بعمل Implements للواجهة ICairoFunctions التي نحصل عليها في المشروع الأول
5- نكتب الكود الفعلي للدوال و الروتينان
6- نقوم بعمل Build للمشروع الثاني وهنا سنحصل علي ملف اسمه CairoFunctions.dll هذا الملف سنجد منه نسخة تحت الفهرس Debug الخاصة بالمشروع الثاني
7- هنا علينا ان نقرر ماذا نفعل بالملف
هل نقوم بتشفييره أم لا
أيضا علينا أن نقرر أين نحتفظ بهذا الملف مثلا ممكن نحتفظ به في ملف داتابيز او ماشابه ذلك
في حالتنا هنا ومن أجل السهولة لا غير سوف أقوم بوضع نسخة من هذا الملف الي Resources الخاصة بالمشروع الرئيسي
الكود التالي يوضح شكل الكلاس CairoCommonFunctions
المشروع الرئيسي
أخيرا و في المشروع الرئيسي
نستخدم Reflection في عمل Load للمشروع الثاني
ونستخدم الواجهة Interface الموجودة في المشروع الأول قي الربط بين المشروع الثاني و المشروع الرئيسي
وبهذا لا يظهر الكود الفعلي في المشروع الرئيسي
الكود التالي يوضح هذا
في المرفقات ستجدون نسخة كاملة من المشروعات الثلاثة و هي كالتالي
المشروع الأول : CairoCommon
المشروع الثاني : CairoFunctions
المشروع الرئيسي : Test_Cairo
الموضوع هذا يمثل أساس جيد لأفكار كثيرة لكيفية اخفاء الكود الخاص بك
أتمني أن يكون الموضوع مفيدا للبعض منكم
تقبلوا تحياتي
الهدف من هذا الموضوع هو توضيح كيفية استخدام الواجهات Interface في الربط بين ملف Dll و البرنامج الرئيسي
هذه الفكرة تسمح للمبرمج باستخدام الواجهات Interface في اسدعاء الدوال بدون أن يظهر الكود الفعلي في البرنامج الرئيسي
أيضا هذا الأسلوب يسمح للمبرمج بتشقيير ملف او ملفات Dll التي تحتوي علي الكود الفعلي
الكود الفعلي يمكن الاحتفاظ به في صورة مصفوفة بايت في
ملفات داتابيز
أو في ملفات عادية
أو يمكن اضافته الي Resources المشروع الرئيسي
أو يمكن وضغه تحت فهرس معين اثناء عمل Setup للمشروع الرئيسي
ثم يتم قراءة الكود باستخدام Reflection و نسترجع ما يقوم الكود الفعلي بتنفيذه عن طريق استخدام الواجهات Interface
خطوات التنفيذ:
التنفيذ يحتاج الي دراية تامة بكيفية كتابة Interface و كيفية كتابة كلاسات و دوال و روتينات مختلفة و بحرفية تامة
ايضا الموضوع يحتاج الي الصبر من المبرمج حتي يتأكد أن الفكرة يتم كتابتها وإستخدامها يالشكل الصحيج من داخل المشروع الرئيسي
1- يتم بناء مشروع من النوع class library هذا المشروع سيحتوي علي Interface واحد أو أكثر من Interface وهذا طبقا لاحتياج المبرمج
وبعد الانتهاء تماما من هذا المشروع وعمل Build له يتم اضافة نسخة منه الي المشروع الثاني و الثالث وذلك باستخدام Add Reference
2- يتم بناء مشروع ثاني من النوع class library وفي هذا المشروع يتم عمل Implementation للواجهات الموجودة في المشروع الأول وهنا يتم كتابة الكود الفعلي
وبعد الانتهاء تماما من هذا المشروع وبعد عمل build له ممكن أن نقوم بتشفيير الملف او نستخدمه بشكل مباشر في المشروع الرئيسي بحيث نضيفه مثلا الي Resources المشروع الرئيسي و هذا متروك للمبرمج
3- أخيرا المشروع الرئيسي
وفي هذا المشروع نستخدم الواجهات الموجودة في المشروع الأول في استدعاء الدوال من المشروع الثاني و بهذا نضمن أن الكود الفعلي لا يظهر في البرنامج الرئيسي
ملاحظات:
اولا : يجب ان نضع في الاعتبار استخدام مسميات مناسبة وغير مكررة للواجهات و للمشاريع بشكل عام
ثانيا : يجب استخدام نفس Build او نفس version الخاص بالمشروع الأول في المشروعان الثاني و الثالث
الكود:
المشروع الأول
1- نفتح مشروعا جديدا من النوع Class Libraray و نعطيه اسما مناسبا و ليكن مثلا CairoCommon
2- نضيف لهذا المشروع واجهة Interface بإسم مناسب و ليكن مثلا ICairoFunctions
3- نكتب الدوال و الروتينات التي نريدها في الواجهة Interface
4- نقوم بعمل Build للمشروع وهنا سنحصل علي ملف اسمه CairoCommon.dll هذا الملف سنجده تحت الفهرس Debug الخاص بالمشروع الأول
5- ثم نضيف نسخة من هذا المشروع الي المشروع الثاني وتحديدا الي References المشروع الثاني وذلك ياستخدام Add Refreence
6- أخيرا نضيف نسخة من هذا المشروع الي المشروع الرئيسي وتحديدا الي References المشروع الرئيسي وذلك ياستخدام Add Refreence
شكل الكود الخاص بالواجهة ICairoFunctions سيكون كالتالي
أنا فقط أضفت دالة واحدة من أجل المثال و هي دالة سوف تقوم بتحويل مصفوفة من البايت الي String
PHP كود :
Public Interface ICairoFunctions
Function ConvertToString(bytes As Byte()) As String
End Interface
المشروع الثاني
1- فتح مشروعا جديدا من النوع Class Libraray و نعطيه اسما مناسبا و ليكن مثلا CairoFunctions
2- نضيف للمشروع كلاسا اسمه CairoCommonFunctions
3- نقوم بعمل Imports لفضاء الأسماء الخاصة بالمشروع الأول
4- نقوم بعمل Implements للواجهة ICairoFunctions التي نحصل عليها في المشروع الأول
5- نكتب الكود الفعلي للدوال و الروتينان
6- نقوم بعمل Build للمشروع الثاني وهنا سنحصل علي ملف اسمه CairoFunctions.dll هذا الملف سنجد منه نسخة تحت الفهرس Debug الخاصة بالمشروع الثاني
7- هنا علينا ان نقرر ماذا نفعل بالملف
هل نقوم بتشفييره أم لا
أيضا علينا أن نقرر أين نحتفظ بهذا الملف مثلا ممكن نحتفظ به في ملف داتابيز او ماشابه ذلك
في حالتنا هنا ومن أجل السهولة لا غير سوف أقوم بوضع نسخة من هذا الملف الي Resources الخاصة بالمشروع الرئيسي
الكود التالي يوضح شكل الكلاس CairoCommonFunctions
PHP كود :
Imports CairoCommon
Public Class CairoCommonFunctions
Implements ICairoFunctions
Public Function ConvertToString(bytes() As Byte) As String Implements ICairoFunctions.ConvertToString
Dim result As String = String.Empty
If bytes IsNot Nothing Then
Dim i As Integer = 0
While i < bytes.Length
Dim b As Byte = bytes(i)
result += b.ToString
result += " "c
i = (i + 1)
End While
End If
result = result.TrimEnd(" "c)
Return result
End Function
End Class
المشروع الرئيسي
أخيرا و في المشروع الرئيسي
نستخدم Reflection في عمل Load للمشروع الثاني
ونستخدم الواجهة Interface الموجودة في المشروع الأول قي الربط بين المشروع الثاني و المشروع الرئيسي
وبهذا لا يظهر الكود الفعلي في المشروع الرئيسي
الكود التالي يوضح هذا
PHP كود :
Imports CairoCommon
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' قراءة مصفوفة البايت الخاصة بالمشروع الثاني
Dim buffer As Byte() = My.Resources.CairoFunctions
' تحميل الملف
Dim dll As System.Reflection.Assembly = System.Reflection.Assembly.Load(buffer)
' تعريف متغير يعبر عن اسم الكلاس في المشروع الثاني شاملا الاسم الخاص بفضاء الأسماء الموجود بها الكلاس
Dim dllName As String = "CairoFunctions.CairoCommonFunctions"
Dim t As Type = dll.GetType(dllName)
' أخيرا نحصل علي الواجهة كالتالي
Dim cairoFunctions As ICairoFunctions = CType(Activator.CreateInstance(t), ICairoFunctions)
' اخسرا نسخدم الدالة الموجودة في الواجهة
Dim values As Byte() = New Byte() {100, 200, 210}
Dim s As String = cairoFunctions.ConvertToString(values)
Me.Text = s
End Sub
End Class
في المرفقات ستجدون نسخة كاملة من المشروعات الثلاثة و هي كالتالي
المشروع الأول : CairoCommon
المشروع الثاني : CairoFunctions
المشروع الرئيسي : Test_Cairo
الموضوع هذا يمثل أساس جيد لأفكار كثيرة لكيفية اخفاء الكود الخاص بك
أتمني أن يكون الموضوع مفيدا للبعض منكم
تقبلوا تحياتي
Retired