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

الدمج بين C++ Native و لغات الدوت نت

بدأه C++er في 19 مايو 2009 · 12 رد · 923 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

محور سؤالى يتلخص فى عمل Import للـ Math struct الموجود فى ذلك الموضوع لإستخدامه من خلال الـ VB.Net او C# .

على اعتبار انى قمت بعمل تغيير بسيط فى المشروع الموجود فى الرابط السابق بحيث اصبح ناتجه DLL و حذفت الملف main.cpp و قمت بتعديل تعريف الـ struct ليصبح كالتالى

class  __declspec(dllexport) Math

بحثت كثيرا و وجدت بعض الأدوات التى تقوم بتلك العمليه و لكنها كانت غير كافيه فأنا أريد ان اعرف كيف تتم العمليه لذا فقد قمت بتجربة بعض الطرق أسردها لكم فيما يلى:

** ناتج المشروع الذى احتاجه فى تطبيق الطرق التاليه هو الملف MyMath.h و MyMath.Lib و MyMath.dll

1 - قمت بإستخدام برنامج PE Editor و فتحت الملف MyMath.dll و اخذت جميع اسماء الدوال التى تم عمل Export لها من الـ Class.

2 - بدءت مشروع VB جديد و بعدها قمت بعمل class و وضعت بداخلها تعريفات الدوال كـ private بإستخدام Declare Function - او يمكنك استخدام DllImportAttribute إن احببت فكلاهما متشابه.

3 - قمت بعمل دوال Public على مستوى الـ class و كل ما تقوم به هو استدعاء دوال الـ API التى قمت بتعريفها سابقا.

هذه الطريقه نفعت تماما و قد عملت و لكن ليس بنجاح تام و الأسباب هى:

1 - فى مشروعى الحقيقى لا يحتوى على class واحده و انما على حوالى 50 واحده و كل واحده تحتوى على عدد لا بأس به من الدوال و منها ما يعمل عمل الخصائص و بالتالى إن استخدمت هذه الطريقه فستستهلك منى وقت كبيييير للإنتهاء من كتابة استدعاء لكل تلك الدوال.

2 - و المشكله الأهم ان الـ Exception فى الـ C++ مختلفه تماما عن اختها فى الدوت نت فعندما اقوم بتمرير قيم غير منطقيه للداله تقوم برمى استثناء و كل ما اقوم بعمله فى الدوت نت هو عمل catch لهذا الـ exception الذى لا يحتوى على اى نوع من المعلومات المفيده فقط SEH Exception has been thrown - جرب استدعاء الداله premute او combin بقيمة y اكبر من x و ستعرف ماذا اقصد.

الطريقه الأخرى بدء مشروع مكتبه dll بلغة C++.Net و عمل Import للملف الـ header ثم من Additional Dependices الخاصه بالـ Linker قمت بوضع اسم الملف MyMath.Lib حتى يقوم بعمل Link عليه و لكنه لا يقترب منه ابدا.

هذه هى الطرق الموجوده امامى و لا اجد سواها و لكنى مستمر فى البحث فإن و جدت طرق أخرى سأشارككم بها.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة Game Expert في 19 مايو 2009 في 23:01

مدونتي: C++ Tips and Tricks

#2

لست أدرى لكنى لم أفهم تقريبا معنى السؤال

هل تريد أن تستخدم الstruct التى أشرت إليها فى الدوت نت !!

DLLImport لا يستخدم إلا من أجل الfunctions

هل تعلم أنه يستخدم من أجل شئ آخر؟؟

يجب عليك أن تبنى الـStruct مرة أخرى فى الدوت نت لكى تستخدمها

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#3
اقتباس
و المشكله الأهم ان الـ Exception فى الـ C++ مختلفه تماما عن اختها فى الدوت نت فعندما اقوم بتمرير قيم غير منطقيه للداله تقوم برمى استثناء و كل ما اقوم بعمله فى الدوت نت هو عمل catch لهذا الـ exception الذى لا يحتوى على اى نوع من المعلومات المفيده فقط SEH Exception has been thrown - جرب استدعاء الداله premute او combin بقيمة y اكبر من x و ستعرف ماذا اقصد.

الحل الذى اعرفه لهذه المشكله هو اما (الاتنين واحد انما الهيكل فقط مختلف ) :-

1) تغير فى ال return type بدل من القاء exception (بمعنى تعمله catch فى ال c++ وهنا ترجع قيمه تعبر عن ال exception )

2) الاكثر نظاما هو ان ترسل مع كل داله Error Object يكون معرف فى ال C++ وعلى اساسه تحدد حدوث مشكله من عدمه (هل هو null لا اذا فما ال category له وما هو تحديدا فى هذه ال category ) وبالتأكيد يتم ملأه فى ال c++

#4

بالنسبة للـexception

تستطيع أن تبنيه فى الدوت نت بكل سهولة

كنت أعمل فى مشروع لعمل نموذج لCall Center و كان معنا عتاد خاص بالأمر

و كان مع هذا العتاد API مكتوب السى خاص به

كان يوجد حوالى 50 دالة فى مكتبة كانت معه و كان النظام سوف يتم بناءه بالدوت نت

فقمت بكتابة دوال هذه المكتبة كلها أنا و زميل لى بالعمل و بنينا لها نظام الExpetion handling الخاص بها

كنت قد أعتمدى على ا، كل دالة تقوم بإرجاع قيم معينة على هذا الأساس بنينا نظام معالجة الأخطاء

و معظم دوال الapi الخاصة بالويندوز تعمل على هذا الأساس

عندك مثلا الTapi 2.2 مكتبة مبنية بواسطة السى لكى تمكنك من كتابة برامجك الخاصة بكل شئ له علاقة بالهواتف الأرضية (قصة طويلة)

المهم عملت بها أيضا لفترة و كانت كل دالة تقوم بإرجاع قيمة تعبر عن الخطأ و نوعه

كل الذى علي فعله هو أن أقوم بالنظر فى معنى القيمة فى الـMSDN لكى أعرف مدلولها

لذلك فهناك كما قال ASDen

إما أن تعتمد على موضوع القيم و إما الآخر ألا و هو الerror object

و أظن أن الأول أسهل فى التعامل من ناحية الـinteroperability حيث أن هذا سوف يتم من خلال السى شارب و ليس من خلال السى بلس بلس

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#5

انا هشرح وجهة نظرى، علشان الموضوع يبقى الموضوع واضح لكم.

انا شغال فى Framework خاصه بى بقالى فتره طويله و كلها معموله بالـ C++ و هى لسه مخلصتش بس الجزء اللى خلص منها كبيير و شغال كويس جدا و بدون مشاكل و اكبر جزء خلص هو جزء متعلق بالرياضيات و اسم المكتبه الخاصه به XMath و هو أختصار لـ Extreme Math.

دلوقتى فى مكتبه رئيسيه بتقوم عليها كل المكتبات داخل الـ framework و هى XCore و هى اختصار لـ Extreme Core و دى بتحتوى على ما فمتهم من اسمها على اساس ثابت و معيار محدد لكل المكتبات حتى الـ Datatypes او الـ Exceptions.

دلوقتى مكتبة XMath على وشك الإنتهاء من الإصدار الأول منها و المفترض ان البرنامج التطبيقى الخاص بها (على ما كنت مخطط) اما هعمله بالـ VB.Net او C++.Net (انا لسه بذاكرها) طبعا النظام اللى ماشيه بيه الـ Framework انا مش هينفع اغيره علشان خلاص بقى Stable على اكتر من مكتبه و كلهم شغالين مع بعض بشكل كويس.

فكرة الـ ErrorCode انا فكرت فيها يعنى انى اعمل حاجه زى HResult الموجوده فى COM بس الموضوع ده منفعش لإنى زى ما شرحت كل مكتبه ليها classes خاصه بالـ exceptions بتاعتها و كل واحد منهم بيقوم بوظيفته بكفاءه، و بالتالى فموضوع الـ ErrorCode منفعش.

اما بالنسبه للـ ErrorObject فهو سيؤدى إل تعديل شامل فى المكتبه لتقبل كل داله فيها معامل اضافى و ايضا هى فكره غير عمليه مع انها فعاله - لو كنت اخدت بالى منها فى الأول.

طبعا كل ده ممكن يعنى ان الـ interoperability الخاصه بالكود بتاعى مش هتنفع. و انا بقول ممكن علشان احاول ادى لنفسى فرصه تانيه للتفكير

برضه لو لقيت حاجه جديده هبلغكم.

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Game Expert في 20 مايو 2009 في 06:19

مدونتي: C++ Tips and Tricks

#6

اه

أنت تبنى framework

كنت أظن أن الأمر متعلق بشئ بعينه

أتضح أن الأمر عام

عموما وفقكم الله

و لكن الـXCore ههذه من تصميمك أم ماذا

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#7

فى الواقع انا ابنى Framework كامله للتعامل مع الجرافكس بعيدا عن نظام التشغيل هذه الفكره اتتنى من حوالى سنه و نصف

الهدف النهائى من المكتبه انها تعمل على نظام تشغيل ويندوز و لينوكس و اكس بوكس - فيما بعد (ماكنتوش - بلاى ستيشن بس انتهى من المجموعه الأولى دى).

المكتبه مبتتعاملش مع الـ DirectX او الـ OpenGL على العكس هى بتتعامل مع الـ DeviceDriver بشكل مباشر.

المكتبه اسمها ExtremeLibrary و تحتوى على العديد من المكتبات الفرعيه منهم :

1 - XCore : و هى اساس كل المكتبات و تحتوى على واجهات عامه تستخدم كـ Refelction للكلاس و انواع البيانات حيث ان انواع البيانات يختلف من نظام تشغيل لأخر و الـ Base Exception الذى تقوم عليه كل الـ Exceptions فى كل المكتبات الاخرى.

2 - XMath : و تحتوى على العديد من الدوال الرياضيه مثل اللوغارتمات و المصفوفات و المفكوك و بعض نظم الإحداثيات كالديكارتى الثنائى و الثلاثى الأبعاد و الدائرى و بعض الإمكانيات الأخرى.

3 - XDataStructure : من اسمها هى مجموعه من الكلاسز التى تختص بالتعامل مع الـ Data Structure و ايضا دوال التى تدعمها.

بعض المكتبات الأخرى التى مازلت اعمل فيها و لكنها فى البدايه X3D ـ XPhysics - XScript.

توجد بعض المكتبات الأخرى التى لم ابدء فيها مثل XAudio - XAI

و ربنا هو المعين

مدونتي: C++ Tips and Tricks

#8

هناك فكره ربما تجعلك تدعم ال interop بدون لعب فى ال code base ... ولكنها ستتطلب عمل

فقط تبنى Thin wrapper حول دوال المكتبه ياخذ الامر وال error object ينفذه .. فى حاله حدوث exception يملأ ال object ببياناته ويرجعه

هذه ربما تبدو كبيره ولكنها مفيده جدا وسريعه لانك لن تمس ال code base وبهيكلها الغير مقيد ب implementation معينه سيمكنك بعد ذلك ايضا من تسهيل تحويل ال parameters ,وبالتالى استعمال المكتبه من اماكن كثيره بسهوله دون تعب من ناحيه المستخدم (شىء اخير لا تقصر تفكيرك على ال .Net فقط اثناء ال test العالم رحب جدا )

#9

المشكله اخى ASDen ان المكتبه تمت برمجتها بالفعل و لم يتبقى على الإنتهاء منها الكثير بالنسبه لما تم.

طريقو عمل Interop للدوال قمت بتجربتها من قبل و قد نفعت و قد اخذت منى وقت ليس طويل جدا لإنى جربت على مثال بسيط (المثال فى اول مشاركه) بالنسبه للجزء الخاص بالـ Exception اللى انت اتكلمت عنه ياريت توضح علشان انا مش فاهم قصدك ايه.

تم تعديل هذه المشاركة بواسطة Game Expert في 20 مايو 2009 في 14:54

مدونتي: C++ Tips and Tricks

#10

ما اقصد ب Thin wrapper التالى :-

مكتبه اخرى بال C++ ايضا تستمعل مكتبك (ومن هنا مكتبتك لا تغير فيها سطر )

ماذا تفعل هذه المكتبه الاخرى ؟

تحتوى على ال public members لمكتبتك ... تأخذ نفس ال parameters (أو اشياء ابسط فى التحويل ... المهم نفس المعلومات )

ما الجزء الاضافى ؟ ال Error Object يضاف لل parameters (أو يكون هناك واحد عام / أو واحد لكل كلاس .. على حسب تصميمك واختياراتك)

هذا ال Object (سواء عام او خاص بكل داهل مع ال params ) يحدث له setting داخل ال wrapper على حسب ال exception الذى سيحدث له raising من ال exception system بتاعك

ثم من الناحيه الاخرى انت تستعمل ال wrapper وليس مكتبتك مباشره

و الناحيه الاخرى (.Net أو اى شىء اخر ) يستخدم ال Error Object و ال lib docs فى معرفه ماذا حدث

-------

اقتباس
و قد نفعت و قد اخذت منى وقت ليس طويل جدا

اختلف معك

الا لو لم تكن تستعمل ابدا اى strucures أو classes متوسطه حتى

العمليه تزداد صعوبه غالبا دون داعى...

ولكنها افضليه ومسأله design بحته فى النهايه

#11

حل جيد ان اقوم بعمل مكتبه wrapper اخرى لمكتبتى و بالتأكيد سيكون بالـ C++ و بالطبع ستكون C++ Native.

بعدها اقوم بعمل wrapper اخر للـ wrapper السابق لأستطيع التعامل معه من خلال الدوت نت (انا متمسك بالدوت نت قليلا لإنها سهله و انا اعرفها).

فعلا فعلا كلامك صحيح بنسبه 1000% حيث انها ستأخذ وقت طوييل - يعنى ممكن نقول عمر بحاله - بس انا لقيت فكره تانيه محتاج اخد رأيكم فيها.

انا كنت بستخدم الـ IDL لفتره طويله لعمل export للـ classes الخاصه ب COM، هل ممكن تطبيق هذه الطريقه على مكتبتى حيث ان تصنيع TypeLibrary سيأخذ وقت اقل قليلا من هذا الـ Wrapper.

مدونتي: C++ Tips and Tricks

#12

أخى بارك الله فيك

هل الذى تصنعه تقوم بالكتابه عنه فى مدونة مثلا أو أى شئ من هذا القبيل

أود متابعة ما تصنع !

فكرة جيدة أتمنى أن تنجح فيها

أريد أن أعرف كيف خططت لمثل هذا الأمر

يعنى كيفت وضعت الهيكل

لفت إنتباهى أنك سوف تتعامل مع الهارد ويير مباشرة

كيف سوف تقوم بذلك

الذى تتحدث عنه هنا معناه (و الذى لا أعلم كيف سوف تفعله أو أنك بالفعل فعلته) أنك سوف تتعامل مع الهارد ويير دون حاجز نظام التشغيل

ممكن تقل لى أين سوف تكون مكتبتك بالنسبة لهذه المعمارية :

Cc768129.winarc01_big(en-us,TechNet.10).gif

هل الكود الخاص بك سوف يتخطى الHAL !

أرجو توضيح هذه النقطة

ملحوظة هذه معمارية الNT و لكن هذا الأمر لن يؤثر كثيرا

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#13

اعتقد انك فهمت كلامى بشكل غير صحيح عندما قصدت دون الإعتماد على نظام تشغيل لم اقصد انى سأبرمج دون الإستعانه بنظام التشغيل حيث انى فى مكتبتى اتعامل مع الـ Device Driver فقط و بالتالى عندما احتاج للتعامل مع كارت الشاشه فإنى اقوم بإعطاء الأوامر للـ Device Driver بشكل مباشر و من هنا فأنا لا احتاج للـ DirectX او الـ OpenGL.

فى الحقيقه انا ادرس الموضوع فى الوقت الحالى و هو برمجة الـ Devie Drivers و التعامل معها.

انا لا اكتب عن الموضوع فى اى مدونه (للأسف) لإن عملى فى المشروع غير مرتبط بوقت (بسبب التأهيل للماجستير و العمل) .

بلطبع الكود الخاص بى لن يتخطى الـ HAL (معرفتى بالـ Assembly لا تتيح لى الوصول لهذه الدرجه) و لكن داخل مكتبة X3D سيتم التعامل مباشرة مع User-Mode Kernal شأنه شأن برمجة اى Device Drvier (الـ DirectX تمت برمجته فى هذه الطبقه).

القى نظره على هذا الملف الذى يتحدث عن امكانيات الـ Device Drivers الجديده داخل نظام التشغيل ويندوز

CLN_T361_WH07.rar

مدونتي: C++ Tips and Tricks

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