مختلط C++/CLI TypeLoadException القيد الداخلي:الكثير من المجالات

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

سؤال

في سعيي لترحيل بعض واجهات المستخدم الجديدة إلى Managed/C#، قمت مؤخرًا بتشغيل دعم وقت تشغيل اللغة العامة (/clr) في مشروع قديم كبير، والذي يستخدم MFC في ملف DLL مشترك ويعتمد على حوالي اثني عشر مشروعًا آخر ضمن نطاقنا. الحل الشامل.هذا المشروع هو جوهر تطبيقنا، وسيقوم بتشغيل أي تعليمات برمجية مُدارة لواجهة المستخدم يتم إنتاجها (وبالتالي الحاجة إلى تشغيل دعم clr للتشغيل المتداخل).

بعد إصلاح الكثير من الأخطاء والتحذيرات الصغيرة، تمكنت أخيرًا من تجميع التطبيق.ومع ذلك، يؤدي تشغيل التطبيق إلى ظهور EETypeLoadException ويتركني غير قادر على تصحيح الأخطاء...

أثناء إجراء بعض البحث، وجدت أن السبب هو "System.TypeLoadException:القيد الداخلي:هناك عدد كبير جدًا من الحقول." والذي يحدث مباشرة في نهاية التجميع.ثم وجدت هذا الرابط مما يقترح تقسيم التجميع إلى قسمين أو أكثر من ملفات dll.ومع ذلك، هذا غير ممكن في حالتي، حيث أن القيد الذي أواجهه هو أن الكود القديم يظل دون تغيير.

هل يمكن لأي شخص أن يقترح أي حلول أخرى ممكنة؟أنا حقا في طريق مسدود هنا.

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

المحلول

تأكد من أن تمكين تجميع السلسلة تم تشغيل الخيار ضمن C/C++ Code Generation.

عادة ما يصلح هذه المشكلة ، والتي هي واحدة من هؤلاء "هاه؟" قيود MS مثل حد 64k على جداول بيانات Excel.يؤثر هذا فقط على عدد الرموز التي قد تظهر في التجميع.

نصائح أخرى

هل تحتاج إلى تشغيل /clr للمشروع بأكمله؟هل يمكنك بدلاً من ذلك تشغيله فقط لعدد صغير محدد من الملفات وتوخي الحذر الشديد في كيفية تضمين التعليمات البرمجية المُدارة؟أنا أعمل مع تطبيق C++/MFC كبير ووجدنا أنه من الصعب جدًا استخدام C++ المُدار.أنا أحب C# و.NET لكن إدارة C++ لم تكن سوى صداع.معظم مشاكلنا حدثت مع .NET 1.0/1.1 ...ربما الأمور أفضل الآن.

لقد قمت بذلك باستخدام تطبيقات الوضع المختلط الكبيرة جدًا (C#/C++) ثلاث مرات (3x) وبمجرد وضع الإصلاح أعلاه في مكانه، لم أشاهد الخطأ مرة أخرى مطلقًا.

لا، إذا كان هناك أي شيء، فمن المفترض أن يؤدي ذلك إلى تنفيذ وقت تشغيل أسرع قليلاً (ومع ذلك، لا شيء يمكنك قياسه على الإطلاق).

لكنني أوافق على أنها مؤقتة إلى حد ما.لم يكن الحد الداخلي للرموز يشكل مشكلة، أو إذا كان الأمر كذلك، كان هذا الحد أعلى من ذلك بكثير.ثم قام MS بتغيير بعض رموز أداة التحميل.لقد دخلت إلى MSDN وتحدثت بصخب حول هذا الموضوع وقيل لي بعبارات لا لبس فيها، "فقط الأحمق هو الذي يمكنه وضع العديد من الرموز في مجموعة واحدة".

(وهذا هو أحد الأسباب التي جعلتني لم أعد أشارك في MSDN.)

حسنًا، اعتبرني غبيًا، لكنني لا أعتقد أنه يجب علي تغيير البنية المادية لتطبيقي، وتقسيم الأشياء إلى ملفات DLL للأقمار الصناعية، فقط للالتفاف على حقيقة أن المُحمل قد قرر أن 10001 رمزًا هو رقم واحد أكثر من اللازم.

وكما أشرت، غالبًا لا نملك السيطرة على كيفية بناء التجميعات/مكتبات الارتباط الحيوي (DLL) الخاصة بالأقمار الصناعية، ونوع التبعيات التي تحتوي عليها.

لكنني لا أعتقد أنك سترى هذا الخطأ مرة أخرى، على أي حال.

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