سؤال

مشروعي في C# - سنسميه SuperUI - يستخدم للاستفادة من فئة من تجميع خارجي.الآن لم يعد الأمر كذلك، لكن المترجم لن يسمح لي ببناء المشروع دون وجود مرجع التجميع في مكانه.اسمحوا لي أن أوضح.

يستخدم هذا المشروع لرمي فئة استثناء مخصصة والتقاطها - SuperException - المشتق من System.Exception القياسي والموجود في مجموعة منفصلة ومترجمة مسبقًا، SuperAssembly.DLL, ، الذي أشرت إليه.

في نهاية المطاف، قررت أن هذا كان تمرينًا لا طائل منه واستبدلت كل شيء SuperExceptions مع System.SuitableStandardException في كل حالة.لقد قمت بإزالة الإشارة إلى SuperException.DLL, ، لكنني الآن التقيت بما يلي عند محاولة تجميع المشروع:

يتم تعريف النوع "SuperException" في تجميع غير مشار إليه.يجب عليك إضافة مرجع إلى التجميع "SuperException, Version=1.1.0.0 (...)"

الملف المصدر المشار إليه بواسطة الخطأ لا يبدو ذا صلة؛إنها مساحة اسم المشروع التي يتم تسليط الضوء عليها في IDE.

الآن، إليك الأمر:

  1. جميع استخدامات SuperException تم حذفها من رمز المشروع.
  2. بالمقارنة مع مشروع آخر يجمع بشكل جيد دون الرجوع إلى SuperException.DLL, ، أنا أشير فقط إلى تجميع آخر - و that لا يشير إلى أي شيء لا يشير مشروعي إلى نفسه.في حين أنه من الممكن أن يتم التخلص من أي من هذه التبعيات SuperExceptions, ، أنا فقط ألتقط فئة الاستثناء الأساسية وعلى أي حال ...المشروع الآخر يبني بشكل جيد!
  3. لقد قمت بتنفيذ "الحل النظيف" الخاص بـ Visual Studio وقمت بمسح كل شيء يدويًا عدة مرات.

إن تضمين هذه الإشارة ليس نهاية العالم، لكنني لا أرى سبب ضرورتها بعد الآن.نرررج.نرحب بأي مؤشرات!

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

المحلول

من المحتمل أن يكون مرجعًا متعديًا، حيث تقوم بعض استدعاءات أسلوب الكتابة بإرجاع مثيل SuperException محاصر ("downcast") على سبيل المثال.استثناء، ولكن من فحص الكود الموجود في الكود المتضمن بشكل متعدي، أي.من استدعاءات الطريقة الخارجية، يعلم المترجم أنك بحاجة إلى أن تكون قادرًا على الحصول على معلومات حول هذا النوع في مرحلة ما.

سيخبرك Resharper بالمكان الذي تحتاج فيه إلى إضافة مرجع، ويمكنك استخدام Lütz Roeder's المعروف أيضًا باسم RedGate's Reflector لمسح IL المترجم بحثًا عن مرجع لهذا النوع بطريقتين:1) استخدم أداة البحث، 2) افتح كل نوع عام تستخدمه وبالنسبة لهذا النوع الذي يتطلب التجميع "الشبح"، فسوف يطلب منك تحديد موقعه.

يحدث هذا غالبًا لي عندما أشير إلى Castle.Windsor وليس Castle.MicroKernel.:ص

نصائح أخرى

  1. اخرج من Visual Studio
  2. احذف مجلدات bin وobj في دليل الحلول الخاص بك
  3. أعد التشغيل وانظر ماذا سيحدث

وأنا أتفق مع التعليقات الأخرى هنا..هناك إشارة، في نص عادي مكان ما !لقد واجهت مشكلات مماثلة في الماضي حيث لم يُرجع البحث في ملفات المشروع شيئًا، وتبين أنه كان في ملف آخر لم يتم التقاطه تلقائيًا في البحث.

لا أعتقد أن إنشاء مشروع جديد هو الحل هنا..عليك أن تكون إيجابيا ذلك لا أحد من المراجع الموجودة في شجرة التبعية الخاصة بك استخدم SuperException.. لا أحد

لم أختبر هذا مطلقًا إلى الحد الذي كنت أحتاج فيه إلى مسح المشروع حرفيًا، لقد وجدت دائمًا المرجع في مكان ما.تأكد من أنك تبحث كل ملف.

يحرر:

مجرد نقطة يجب إضافتها، إذا كان الموقع المشار إليه بالخطأ يبدو عشوائيًا، فقد يعني ذلك غالبًا وجود عدم تطابق بين المصدر المترجم وملف التعليمات البرمجية المصدر.هل هذا تطبيق ASP.NET؟لقد حصلت عليه من قبل حيث لم يتم استبدال ملفات DLL المترجمة عند إعادة البناء في مجلد ASP.NET المؤقت مما تسبب في حدوث أشياء ..مثيرة للاهتمام عند التصحيح :)

لا أعتقد أن هذه مشكلة في الكود.ما يمكنني رؤيته يحدث هو أن أحد مراجعك الحالية ربما يعتمد على هذا النوع في أنواعه الخاصة التي ربما تقوم بإنشائها في تطبيقك.

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

نظرًا لأنه خطأ في المترجم، يجب أن يكون هناك مرجع أو استخدام لـ SuperException في مكان ما في المشروع.

  1. قم بالبحث/الاستبدال في المشروع أو الحل بأكمله لهذا النوع وقم بإزالة كل مرجع (من المحتمل أنك قمت بذلك بالفعل).
  2. إذا قمت بالإشارة إلى أي أنواع ترث من SuperException (حتى لو كان النوع محددًا في تجميع آخر)، فأنت بحاجة إلى مرجع إلى التجميع الذي تم تعريف SuperException فيه.

خذ السطر الذي يعرض فيه المترجم الخطأ وابدأ في تتبع شجرة الميراث للكائنات المستخدمة في هذا السطر، فقد تجد مصدرها بهذه الطريقة.

شكرا لإجاباتك حتى الآن.لقد جربت كل الاقتراحات (باستثناء اقتراح واحد) دون جدوى.

الاقتراح الذي لم أجربه هو إنشاء مشروع جديد وإضافة كل ما عندي إليه، والتفكير فيه يختبر حقًا إرادتي في الحياة.؛) قد أحاول ذلك غدًا إذا كان من الممكن أن أزعجني.شكرًا لك مرة أخرى.

لا يوجد شيء غامض حقًا في مشاريع VS في الوقت الحاضر - فهي كلها ملفات نصية، وما إلى ذلك.يجب أن يشير شيء ما إلى تلك الفئة/dll، ويجب أن يكون هذا الشيء جزءًا من مشروعك.

هل حقا فهمت أو وجدت شجرة الحل بأكملها، كل ملف واحد, ، للإشارة إلى هذا الاستثناء؟

هذا يبدو غريبا جدا.إليك ما سأتحقق منه بعد ذلك:

  1. تأكد من عدم وجود أي شيء متبقي في ملف Properties/AssemblyInfo.cs.
  2. تأكد من عدم وجود أي شيء متبقي في ملف SuperUI.csproj الخاص بك.
  3. احذف جميع المراجع وأعد إضافتها.

حاول إنشاء مشروع جديد وإضافة جميع فصولك الدراسية إليه.

grep مجلد المشروع الخاص بك.يمكن أن يكون مرجعًا مخفيًا في مشروعك، أو مشروعًا يشير إليه مشروعك.نظف باستخدام المفكرة إذا لزم الأمر.

إذا قمت بالإشارة إلى أي أنواع ترث من SuperException (حتى لو كان النوع محددًا في تجميع آخر)، فأنت بحاجة إلى مرجع إلى التجميع الذي تم تعريف SuperException فيه.

سند على ذلك.

ربما لا تكون مرجعًا SuperException, ، ولكن ربما تكون مرجعًا SpecializedSuperException, ، وهو مشتق من، أو يستخدم بطريقة أو بأخرى SuperException - grep الخاص بك للمشروع ل SuperException لن يتم القبض عليه بالرغم من ذلك.

حاول أن يكون لديك اختراق مع تجربة نديبند

هذا هو المكان الذي تحب فيه الأدوات ريشاربر تؤتي ثمارها حقًا - عادةً ما يخبرني بحث بسيط عن "التبعيات الشبحية" عدة مرات.

ربما يمكنك الانتقال إلى تعريفك لفئة SuperException ومحاولة البحث عن جميع المراجع ().قد ترغب أيضًا في التحقق مما إذا كان التجميع SuperException يحتوي على ملف التبعية الدائرية على التجميع الرئيسي الخاص بك (على سبيل المثال، يعتمد التجميع الرئيسي على التجميع الاستثناء يعتمد على التجميع الرئيسي...).

لقد واجهت مشكلة مرجعية مشابهة جدًا للتجميع والتي كانت تحدث عندما كانت مكتبة C# الخاصة بي تحتوي على تجميع C++/CLI تابع.المشكلة هي أنني كنت أرث فئة عامة من تجميع C++/CLI في مكتبة تجميع C# الخاصة بي.وهذا يعني أن سلسلة الميراث كانت تمتد عبر تجمعات متعددة.

كنت آمل أن يكون أي عميل ذكيًا بما يكفي لتحميل مجموعة C++/CLI بشكل غير مباشر في أي وقت تحتاج إليه مكتبة C#، ولكن لم يكن هذا هو الحال حتى في وقت الترجمة.

لقد تخلصت من هذه المشكلة عن طريق كسر الوراثة بين الفئات التي كانت تمتد عبر مكتبتي التجميع واستخدام التجميع بدلاً من ذلك.كان عميلي سعيدًا أخيرًا ولم يعد بحاجة إلى تجميع C++/CLI باعتباره تبعية بعد الآن.

في كلمتك ربما يتعين عليك التأكد من ذلك SuitableStandardException لا يرث من SuperException من أجل القضاء على SuperException.DLL كمرجع.

استخدم التغليف بدلاً من الميراث وقم بإنشاء ملف SuperException عضو البيانات في الجديد الخاص بك SuitableStandardException.

إذا لم يحل ذلك المشكلة، فقد يكون لديك المزيد من الفئات التي تمتد عبر بعض التجميعات، في حالتك SuperAssembly.DLL و superException.dll.

إذا لم تتمكن من العثور عليهم جميعًا، جرب هذه الخدعة:

  1. اجعل جميع أعضائك وفصولك العامة موجودة SuperAssembly.DLL داخلي.

  2. في SuperAssembly.DLL قم بتكوين صداقات مع SuperException.DLL:

    [assembly:InternalsVisibleTo("SuperException, PublicKey=0024000004800000....)]
    
  3. تأكد من قيامهم ببناء وإزالة SuperAssembly.DLL مرجع من أي عميل يشير بالفعل SuperException.DLL.

grep -R SuperException * في قاعدة مشروعك (احصل على grep من مكان ما أولاً) فقط للتأكد.

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