ما هو تأثير وجود مساحات الأسماء في DLLs متعددة؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

لقد ورثت مشروع VB.net الذي يقوم بإنشاء ملفي DLLS:أحدهما لتطبيق الويب والآخر لـ "طبقة الأعمال".هذا لتطبيق فرعي لموقع ويب أكبر.(باستخدام VS2005).

تكمن المشكلة في أن هذا الشيء لا يتناسب مع بنية DLL ومساحة الاسم، وأود أن أعرف ما إذا كان هناك أي تأثيرات على الأداء.

تطبيق الويب الرئيسي هو "Foo"، ويقوم بإنشاء Foo.dll.يحتوي Foo.dll على مساحة الاسم App.Foo، والتي تحتوي على فئات لجميع الصفحات وعناصر تحكم المستخدم وما إلى ذلك.

يوجد أيضًا مشروع "FooLib" الذي يقوم بإنشاء FooLib.dll.يحتوي FooLib.dll أيضًا على مساحة اسم App.Foo، والتي تحتوي على مجموعة من تعريفات الفئات.هناك عدد قليل من مساحات الأسماء الأخرى مثل App.Foo.Data وApp.Foo.Logic وما إلى ذلك.

هل هناك شيء خاطئ بهذا؟كيف يمكن لوقت التشغيل العثور على فئة عبر مكتبات DLL متعددة؟

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

المحلول

عندما يتم تجميع برنامجك، يتم تضمين اسم النوع الكامل مع "الدليل".يتضمن هذا الدليل اسم التجميع ومعلومات الإصدار.وإلا فلن يعرف ما إذا كنت تريد الإصدار 1.0 أو 1.1 أو 2.0 من الفصل.يسمح هذا النظام نفسه بالعثور على فئات مختلفة في نفس مساحة الاسم في تجميعات مختلفة.

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

تتعلق مساحات الأسماء بوظيفة التغليف بطريقة تسهل العثور عليها.تتعلق التجميعات بوظيفة التغليف بطريقة فعالة للتحميل.في بعض الأحيان لا يكونون متماثلين.

نصائح أخرى

لا حرج في هذا، قد تكون المشكلات الوحيدة المحتملة هي أن 1) المطورين الذين يرون "App.Foo.Something" قد لا يعرفون التجميع الذي يجب البحث فيه 2) إذا تم استخدام نفس الاسم في كليهما، فسيتم تجميع التطبيقات مقابل (في c# في على الأقل) سوف تحصل على أخطاء حول أسماء الأنواع الغامضة.

أما بالنسبة لوقت التشغيل، يتم تحديد الأنواع عن طريق التجميع والاسم - مساحة الاسم هي مجرد جزء من اسم الكتابة.لذلك لن يواجه وقت التشغيل أي مشكلة في العثور على النوع - عندما تقوم بتجميع المعلومات حول التجميع الذي سيتم العثور عليه فيه.

لا، لا حرج في هذا.

خذ بعين الاعتبار أنني أستخدم عددًا من مكتبات الفئات المخصصة، وكل واحدة منها تقريبًا لها بنية مساحة الاسم التالية:

.Web.UI.Controls.

وهو مشابه (واقترحه MS كأفضل ممارسة) لـ System.Web.UI.Controls..

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

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

using Foo.App.Foo;
using FooLib = FooLib.App.Foo;

لذلك، إذا كان لديك فئة Bar في كل من Foo.App.Foo وFooLib.App.Foo، للوصول إلى إصدار التطبيق الذي ستستخدمه:

bar x = new bar();

بالنسبة لإصدار المكتبة الذي ستستخدمه:

FooLib.bar x = new FooLib.bar();

لا، ليس هناك خطأ في مساحات الأسماء المتراكبة.ألقِ نظرة على إطار عمل .net نفسه حيث يتم تراكب العديد من مساحات الأسماء.

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

لا أعتقد أن هناك مشكلة فنية للقيام بذلك، في الواقع يستخدم .NET Framework نفسه أحيانًا نفس مساحات الأسماء عبر العديد من التجميعات الفعلية.

مساحة الاسم ليست مواطنًا من الدرجة الأولى في عالم .NET، وأنا نادم على ذلك.

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