من فتره قمت بكتابة موضوع عن برمجة الدوال الرياضيه
محور سؤالى يتلخص فى عمل 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 عليه و لكنه لا يقترب منه ابدا.
هذه هى الطرق الموجوده امامى و لا اجد سواها و لكنى مستمر فى البحث فإن و جدت طرق أخرى سأشارككم بها.
و الله ولي التوفيق
.gif)