سؤال

  1. ما هو الفرق في إنشاء DLL C بسيط بين استخدام Visual Studio 2005 و Visual C ++. لقد رأيت أنه عند إنشائها تحت الاستوديو أيضًا تم إنشاء بيان ، واجهت بعض المشكلات فيما يتعلق بالنشر في جهاز آخر بسبب استخدام مجلد جنبًا إلى جنب (عند استدعاء هذا DLL Application A C# Application "
  2. كيف تعمل آلية استدعاء DLL؟

شكرًا

هل كانت مفيدة؟

المحلول

منذ أن غطى نوبوجز بالفعل سؤالك الأول ، اسمحوا لي أن أتوسع في الثانية. ليس من الصعب للغاية فهمها.

عندما تقوم بتجميع DLL في Windows ، يقوم الرابط بإنشاء جدول عنوان تصدير (EAT) يسرد جميع الوظائف المصدرة (الوظائف التي يوفرها DLL) ومؤشر إلى حيث يتم تنفيذها في DLL نفسها.

عند تجميع تطبيق يرتبط بـ DLL ، يقوم الرابط بإنشاء جدول عنوان استيراد (IAT) يسرد جميع الوظائف التي يتم تنفيذها في DLL الأخرى واسم DLL التي تنفذ تلك الوظائف. الطريقة التي تعرف أن هناك وظيفة في DLL هي من ملف .lib الذي تضيفه إلى مشروعك. هذا يخبر الرابط بأنه يتم تنفيذ وظيفة في DLL.

ثم في وقت التشغيل ، أثناء تحميل تطبيق ما ، يقوم Windows Loader بفحص IAT لمعرفة ما يحتاج DLL إلى تحميله ، وتحديد موقعها ، وتحديث التطبيقات IAT (في الذاكرة) للإشارة إلى الوظائف التي تم تصديرها في تحميل DLL.

هذه هي الأساسيات التي تعمل بها ، وآمل ألا أدرج أي أخطاء جسيمة. وبالطبع P/Invoke هي طبقة أخرى فوق هذا.

إذا كنت تريد المزيد من المعلومات حول كيفية عمل DLL دائمًا وثائق MSDN وإذا كنت تريد التفاصيل الكافية لتجعلك تدور رأسها تقرأ هذه المقالات داخل Windows الجزء 1 و الجزء 2

نصائح أخرى

نعم ، إذا قمت بتجميع رمز DLL باستخدام /MD (الإعداد الافتراضي) فعليك ذلك نشر مكتبات CRT إلى الجهاز المستهدف. إذا كان هذا مجرد DLL مستقل دون أي تبعيات أخرى ، فمن المنطقي تجميع خيار CRT الثابت حتى لا تضطر إلى نشر المكتبات. انقر بزر الماوس الأيمن فوق مشروع DLL الخاص بك ، خصائص ، C /C ++ ، توليد الرمز ، مكتبة وقت التشغيل = /MTD لتكوين التصحيح. كرر تكوين الإصدار ، الآن باستخدام /MT.

Google "P/Invoke Marchaling" لمعرفة المزيد حول كيفية استدعاء التعليمات البرمجية غير المدارة من برنامج مُدار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top