Friend Assemblies
الـ Friend Assembly هو مجمع Assembly مسموح له باستخدام العناصر الموجودة في مجمع آخر والتي تم تعريفها باستخدام محدد الوصول Friend فإن قمت بتحديد مجمع ما في فيجول بايزيك كـ Friend Assembly لم يعد متوجبا تعريف العناصر والأنواع في ذلك المجمع باستخدام محدد الوصول Public كي تتم رؤيتهم من المجمعات الأخرى وتعتبر هذه التقنية مريحة في حالتين:
• عندما تقوم بفحص كود يعمل في مجمع مختلف ولكنه يحتاج للوصول إلى عناصر في المجمع الذي يتم فحصه تم تعريفهم باستخدام محدد الوصول Friend
• عندما تقوم بتطوير مكتبة فئات Class Library وهناك إضافات لتلك المكتبة موجودة في مجمعات مختلفة ولكنها تتطلب الوصول لعناصر في المجمعات الموجودة تم تعريفهم باستخدام محدد الوصول Friend
يمكنك استخدام الصفة InternalsVisibleToAttribute لتحديد واحدة أو أكثر من الـ friend assemblies لمجمع محدد. فمثلا يمكنك تضمين الصفة InternalsVisibleToAttribute في المجمع A وتحديد المجمع B كـ friend assembly فسيكون بإمكان المجمع B الوصول لجميع الأنواع والعناصر في المجمع A التي تم تعريفها باستخدام محدد الوصول Friend كما يظهر في المثال التالي
Imports System.Runtime.CompilerServices
<Assembly: InternalsVisibleTo("FriendAssembliesB")>
' Friend class.
Friend Class FriendAssembliesA
Public Sub Test()
MsgBox("Friend Assemblies Sample Class")
End Sub
End Class
' Public class with a Friend method.
Public Class FriendAssembliesClassA
Friend Sub Test()
MsgBox("Friend Assemblies Sample Method")
End Sub
End Classفجميع المجمعات التي يتم تعريفها بشكل واضح كـ Friend يمكنها الوصول إلى الأنواع والعناصر Friend فمثلا إن كان المجمع B هو Friend للمجمع A و المجمع C له مرجع إلى المجمع B فلن يكن لكلا المجمعين B و C حق الوصول للأنواع Friend في المجمع A
ويقوم المترجم بعمل تدقيقي أساسي لـ Friend Assemblies التي تم تمرير اسمها للصفة InternalsVisibleToAttribute فإن كان المجمع A يعرف المجمع B كـ Friend Assembly تكون قواعد التحقق كما يلي:
• إذا كان المجمع A يمتلك اسما قويا يجب على المجمع B أن يمتلك اسما قويا أيضا. فاسم الـ Friend Assembly الممرر إلى الصفة يجب أن يحتوي على اسم المجمع والمفتاح العام Public Key للاسم القوي Strong-Name Key الذي استخدم لتوقيع المجمع B. واسم الـ friend assembly الذي يتم تمريره للصفة InternalsVisibleToAttribute لا يمكن أن يكون الاسم القوي للمجمع B حيث أنك لا تضمن رقم النسخة للمجمع والثقافة والبناء architecture و ورمز المفتاح العام
• وإن لم يمتلك المجمع A اسما قويا يجب أن يحتوي اسم الـ Friend Assembly على اسم المجمع فقط
• وإن كان للمجمع B اسما قويا يجب أن تحدد الـ strong-name key للمجمع B باستخدام خصائص المشروع أو عن طريق سطر الأوامر باستخدام خيار المترجم /Keyfile