مترجم C# يعمل على تحسين التعليمات البرمجية بشكل غير صحيح

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

سؤال

لدي تطبيق ASP.NET يعمل على خادم ويب بعيد وبدأت للتو في الحصول على هذا الخطأ:

Method not found: 'Void System.Collections.Generic.ICollection`1..ctor()'.

لقد قمت بتفكيك الكود الموجود في ملف DLL ويبدو أن المترجم يقوم بتحسين الكود بشكل غير صحيح.(لاحظ أن Set عبارة عن فئة تنفذ مجموعة من الكائنات الفريدة.إنه يرث من IEnumerable.) هذا السطر:

Set<int> set = new Set<int>();

يتم تجميعها في هذا السطر:

Set<int> set = (Set<int>) new ICollection<CalendarModule>();

فئة CalendarModule هي فئة غير مرتبطة تمامًا !!هل لاحظ أحد من قبل أن .NET يقوم بتجميع تعليمات برمجية بشكل غير صحيح مثل هذا من قبل؟

التحديث رقم 1: يبدو أن هذه المشكلة قد تم تقديمها بواسطة Microsoft ILدمج أداة.ونحن ندرس حاليا كيفية التغلب عليها.

التحديث رقم 2: لقد وجدنا طريقتين لحل هذه المشكلة حتى الآن.نحن لا نفهم تمامًا ما هي المشكلة الأساسية، لكن كلاهما يحلها:

  1. قم بإيقاف تشغيل التحسين.

  2. دمج التجميع مع ILMerge على جهاز مختلف.

لذلك نحن نتساءل عما إذا كانت آلة البناء قد تم تكوينها بشكل خاطئ بطريقة أو بأخرى (وهو أمر غريب بالنظر إلى أننا نستخدم الآلة لبناء الإصدارات منذ أكثر من عام الآن) أو إذا كانت هناك مشكلة أخرى.

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

المحلول

آه، ILMerge - هذه المعلومات الإضافية في سؤالك تساعد حقًا في حل مشكلتك.على الرغم من أنني لم أتوقع أبدًا أن يفشل مترجم .net بهذه الطريقة، إلا أنني أتوقع أن أرى أحيانًا هذا النوع من الأشياء مع ILMerge (نظرًا لما يفعله).

أعتقد أن اثنتين من مجموعاتك تستخدمان نفس "خدعة" التحسين، وبمجرد الدمج، ستحصل على التعارض.

هل قمت بإثارة الخطأ مع Microsoft؟

الحل البديل في هذه الأثناء هو إعادة ترجمة التجميعات من المصدر كتجميع واحد، مما يوفر الحاجة إلى ILMerge.نظرًا لأن ملفات csproj هي مجرد قوائم XML، فمن السهل دمجها بشكل أساسي، ويمكنك تشغيل ذلك تلقائيًا كخطوة MSBuild إضافية.

نصائح أخرى

هل أنت متأكد من أن التجميع الذي تنظر إليه قد تم إنشاؤه بالفعل من الكود المصدري المعني؟هل أنت قادر على إعادة إنتاج هذه المشكلة مع حالة اختبار صغيرة؟

يحرر: إذا كنت تستخدم Reflector، فمن المحتمل أن يكون التحويل من MSIL إلى C# غير صحيح - لا يكون Reflector دائمًا دقيقًا بنسبة 100% عند فك الترجمة.كيف تبدو MSIL؟

تحرير 2: همم...لقد أدركت للتو أنه لا يمكن أن يكون العاكس مخطئًا وإلا فلن تتلقى رسالة الخطأ هذه في وقت التشغيل.

من المرجح أن تكون هذه مشكلة في أداة الانعكاس مقارنة بالتجميع .Net.الخطأ الذي تحصل عليه - من المرجح أن يكون المُنشئ الذي لم يتم العثور عليه أثناء الاتصال عن بُعد مشكلة في التسلسل (تحتاج جميع الفئات القابلة للتسلسل إلى مُنشئ بدون معلمات).

من المرجح أن يؤدي الكود الذي تم العثور عليه من أداة الانعكاس الخاصة بك إلى استثناء typecast.

وأنا أتفق مع كل من كيرت وبيدز.هذا يبدو وكأنه شيء خاطئ للغاية.لقد عمل المُحسِّن لصالحنا جميعًا ولم يتم الإبلاغ عن مثل هذه الأخطاء (التي أعرفها) - هل من الممكن أنك في الواقع تفعل شيئًا خاطئًا؟

ملاحظة جانبية:وأود أيضا أن أشير System.Collections.Generic.HashSet<T> وهو موجود في .Net fx 3.5 ويفعل بالضبط ما Set<> ينبغي للطبقة.

هل تم نشر الكود مؤخرًا على هذا الخادم؟هل يمكن أن يقوم شخص ما بدفع البناء دون علمك؟هل يمكنك الانتقال إلى التحكم بالمصادر وسحب الأحدث وتكرار المشكلة؟

في هذه المرحلة، مع المعلومات المقدمة، أشك في أنه المترجم.

أوه.إذا كان هذا هو خطأ ILMerge حقًا، فيرجى تحديث هذا الموضوع بالنتائج التي توصلت إليها - أستخدم ILMerge كخطوة أساسية في إنشاء مجموعة التشغيل المتداخل لـ COM.

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