استخدام مكتبات الارتباط الحيوي (DLL) المختلطة من /clr:pure project

StackOverflow https://stackoverflow.com/questions/291559

سؤال

أنا أقوم ببناء مشروع مع Dll.

يجب أن يدعم ملف Dll التعليمات البرمجية الأصلية لذلك أعلنت أنه /clr.كان مشروعي في البداية أيضًا مشروعًا /clr وكان كل شيء على ما يرام.ومع ذلك، أود تضمين بعض اختبارات NUnit لذا اضطررت إلى تبديل مشروعي الرئيسي من /clr إلى /clr:pure.

لا يزال يتم تجميع كل شيء ولكن أي استدعاء Dll يؤدي إلى حدوث خطأ في وقت التشغيل.عندما أعود إلى /clr، كل شيء على ما يرام

في ملف Dll الخاص بي، يتم الإعلان عن الوظائف المصدرة على النحو التالي:

#define DllExport   __declspec( dllexport )
DllExport bool DisplayScan(bool bShow, bool bAllPasses) { }

لقد قمت أيضًا بإنشاء ملف .def يحتوي على الأسماء الحقيقية لجميع الوظائف المصدرة

LIBRARY "Controller"
EXPORTS
DisplayScan

من مشروعي الرئيسي تم الإعلان عن وارداتي على النحو التالي:

#define _DllImport [DllImport("Controller.dll", CallingConvention = CallingConvention::Cdecl)] static
_DllImport bool DisplayScan(bool bShow, bool bAllPasses)

أي شخص من أي وقت مضى واجه مثل هذه المشكلة؟

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

المحلول

وتعمل كل شيء طيب الآن

في الواقع، فقد تم العمل منذ البداية.

والأخلاقية: لا تحاول أن يلقي شار * في الأمراض المنقولة جنسيا :: سلسلة

وشيء غريب: عن طيب في / مسح حتى تعود من وظيفة. تعطل على الفور في / مسح: نقية

نصائح أخرى

في الأساس أنت تفعل شيئًا غير مدعوم؛/clr:صادرات DLL النقية والمحلية.كما نقلا عن مقالة MSDN هذه "لا يمكن للتجميعات النقية تصدير الوظائف التي يمكن استدعاؤها من الوظائف الأصلية لأن نقاط الإدخال في التجميع النقي تستخدم اصطلاح الاتصال __clrcall."

لست متأكدًا من الحل الأفضل.ومع ذلك، مع القليل من التجارب، ربما يمكنك الاستفادة من اصطلاح الاتصال __clrcall مع خيار /clr. وهنا الرابط قد يكون ذلك مفيدًا.مما يمكنني جمعه، يجب أن تكون قادرًا على تصدير تلك الفئات المُدارة واستهلاكها من داخل تجميع مُدار مثل مشروع اختبار NUnit المُدار، ولكن احتفظ بصادراتك غير المُدارة هناك بتوقيعات طرق مختلفة.ضع في اعتبارك أنه بمجرد الكشف عن أي فئة .net عبر التصدير، فسوف تحتاج إلى استخدام اصطلاح الاتصال __clrcall.

مزايا /clr:نقي

أداء أفضل:نظرًا لأن التجميعات النقية تحتوي على MSIL فقط، لا توجد أية وظائف أصلية، وبالتالي لا يلزم إجراء أي عمليات انتقال مُدارة/غير مُدارة.(استدعاءات الوظائف التي يتم إجراؤها من خلال P/Invoc هي استثناء لهذه القاعدة.)

الوعي بنطاق التطبيق:توجد الوظائف المُدارة وأنواع بيانات CLR داخل نطاقات التطبيق، مما يؤثر على رؤيتها وإمكانية الوصول إليها.التجميعات النقية هي على دراية بالمجال (يتم تضمين __declspec(appdomain) لكل نوع) لذا فإن الوصول إلى أنواعها ووظائفها من مكونات .NET الأخرى يكون أسهل وأكثر أمانًا.ونتيجة لذلك، تتفاعل التجميعات النقية بسهولة أكبر مع مكونات .NET الأخرى مقارنة بالتجميعات المختلطة.

تحميل غير القرص:يمكن تحميل التجميعات النقية في الذاكرة وحتى دفقها.يعد هذا ضروريًا لاستخدام تجميعات .NET كإجراءات مخزنة.وهذا يختلف عن التجميعات المختلطة، والتي بسبب اعتمادها على آليات تحميل Windows، يجب أن تكون موجودة على القرص من أجل تنفيذها.

انعكاس:ليس من الممكن الانعكاس على الملفات التنفيذية المختلطة، في حين توفر التجميعات النقية دعمًا كاملاً للانعكاس.لمزيد من المعلومات، راجع الانعكاس (C++/CLI).

إمكانية التحكم بالمضيف:نظرًا لأن التجميعات النقية تحتوي على MSIL فقط، فإنها تتصرف بشكل أكثر مرونة وقابلية للتنبؤ من التجميعات المختلطة عند استخدامها في التطبيقات التي تستضيف CLR وتقوم بتعديل سلوكها الافتراضي.

حدود /clr:نقي

يغطي هذا القسم الميزات غير المدعومة حاليًا بواسطة /clr:pure.

لا يمكن استدعاء التجميعات النقية بواسطة وظائف غير مُدارة.لذلك لا يمكن للتجميعات النقية تطبيق واجهات COM أو الكشف عن عمليات الاسترجاعات الأصلية.لا يمكن للتجميعات النقية تصدير الوظائف عبر ملفات __declspec(dllexport) أو .DEF.بالإضافة إلى ذلك، لا يمكن استيراد الوظائف المعلنة باستخدام اصطلاح __clrcall عبر __declspec(dllimport).يمكن استدعاء الوظائف في الوحدة النمطية الأصلية من تجميع خالص، لكن التجميعات النقية لا يمكنها الكشف عن وظائف أصلية قابلة للاستدعاء، لذلك يجب أن يتم الكشف عن الوظائف في تجميع خالص من خلال الوظائف المُدارة في تجميع مختلط.انظر كيف:انتقل إلى /clr:pure (C++/CLI) لمزيد من المعلومات.

مكتبات ATL وMFC غير معتمدة من خلال التحويل البرمجي للوضع النقي في Visual C++.

لا يتم قبول وحدات .netmodules النقية كمدخلات لرابط Visual C++.ومع ذلك، يتم قبول ملفات .obj النقية بواسطة الرابط، وتحتوي ملفات .obj على مجموعة شاملة من المعلومات الموجودة في وحدات الشبكة.راجع ملفات .netmodule كمدخل رابط لمزيد من المعلومات.

دعم Compiler COM (#import) غير مدعوم، حيث سيؤدي ذلك إلى تقديم تعليمات غير مُدارة إلى التجميع النقي.

خيارات النقطة العائمة للمحاذاة ومعالجة الاستثناءات غير قابلة للتعديل للتجميعات النقية.ونتيجة لذلك، لا يمكن استخدام __declspec(align).يؤدي هذا إلى جعل بعض ملفات الرأس، مثل fpieee.h، غير متوافقة مع /clr:pure.

يمكن أن تعطي وظيفة GetLastError في PSDK سلوكًا غير محدد عند التحويل البرمجي باستخدام /clr:pure.

ومشكلتك تدعو conventionCallingConvention = CallingConvention :: Cdecl ... تعريف الدالة من هذا القبيل أو استخدام STDCALL أو clrcall، clecl هو لمحض C

وأو مشكلة هنا هو: تحديد تلك الوظيفة خارجي يست ساكنة

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