سؤال

كيف يمكنني معرفة من اسم التجميع، أو فئة التجميع (أو ما شابه ذلك)، ما إذا كان التجميع جزءًا من .شبكة الإطار (أي System.windows.Forms)?

لقد قمت حتى الآن بدراسة خصائص PublicKeyToken وCodeBase، ولكنها ليست دائمًا نفسها بالنسبة للإطار بأكمله.

السبب وراء رغبتي في الحصول على هذه المعلومات هو الحصول على قائمة بالتجميعات التي يستخدمها ملف EXE الخاص بي والتي يجب أن تكون على الأجهزة العميلة، حتى أتمكن من حزم الملفات الصحيحة في ملف إعداد دون استخدام نظام إعداد Visual Studio.تكمن المشكلة في أنني لا أرغب في التقاط أي تجميعات لـ .NET Framework، وأريد أن تكون عملية تلقائية يسهل نشرها عند الانتهاء من تحديث رئيسي.

الحل النهائي هو وجود خاصية IsFramework ...:)

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

المحلول

أظن أن الطريقة الأكثر موثوقية والأكثر عمومية ستكون PublicKeyToken.نعم، هناك أكثر من واحدة، لكنها ستكون قائمة محدودة وقائمة لا تتغير كثيرًا.

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

نصائح أخرى

ولتحقيق ذلك، أستخدم اسم المنتج المضمن في التجميع من خلال AssemblyProductAttribute.

var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");

أنا أستخدم هذه التقنية لتجميع التجميعات حسب المنتج ضمن شاشة "حول" الخاصة بالتطبيق ويبدو أنها تعمل بشكل جيد بالنسبة لي.

لقد اضطررت للتعامل مع نفس المشكلة بالضبط.لسوء الحظ، جميع الإجابات المقدمة حتى الآن هي غير كافٍ لتحديد ما إذا كان التجميع جزءًا من .NET Framework بشكل آمن.

تضع Microsoft فئة تسمى FXAssembly في مساحة الاسم العامة لكل مجموعة إطار عمل بسلسلة ثابتة تشير إلى الإصدار:

.class private abstract auto ansi sealed beforefieldinit FXAssembly
    extends [mscorlib]System.Object
{
    .field assembly static literal string Version = string('2.0.0.0')

}

استخدم هذه "العلامة" للتحقق مما إذا كان التجميع عبارة عن تجميع إطار عمل.التحقق من المفتاح العام أيضًا لن يضر.

لا، لا يبدأ بـ "النظام".يمكنك التحقق من "WindowsBase" وهو عبارة عن مجموعة إطار عمل.

لا يمكنك أيضًا التحقق من PublicKeyToken، نظرًا لوجود تجميعات Microsoft أخرى موقعة باستخدام المفاتيح "الافتراضية"، ولكنها ليست جزءًا من .NET Framework (تجميعات Visual Studio).

أفضل طريقة للقيام بذلك هي الحصول على مجموعة من أطر عمل .NET المثبتة والتحقق مما إذا كان التجميع المستهدف جزءًا من RedistList (RedistList\FrameworkList.xml).

يمكن العثور على FrameworkList.xml في:

  • صافي 2.0:C:\Windows\Microsoft.NET\Framework64\v2.0.50727 edistList
  • نت 3.x:C:\ملفات البرنامج (x86)\التجميعات المرجعية\Microsoft\Framework\vرقم الإصدار edistList
  • نت 4.x:C:\Program Files (x86) eference Assemblies\Microsoft\Framework.NETFramework\vرقم الإصدار edistList
  • صافي النواة:C:\Program Files (x86) eference Assemblies\Microsoft\Framework.NETCore\vرقم الإصدار edistList

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

عند تثبيت Visual Studio، تحصل على التجميعات المرجعية في المجلدات الفرعية المختلفة للنموذج C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion} - الشيء الأكثر إثارة للاهتمام يمكن أن يكون RedistList\FrameworkList.xml ملف يحتوي على قائمة بجميع أسماء التجميعات التي تم شحنها مع إصدار إطار العمل المحدد.

على سبيل المثال C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml يبدو أنه يحتوي على قائمة بجميع تجميعات Framework .NET 4.0.

يمكنك بسهولة استخدام هذه الملفات لإنشاء قوائم بيضاء ثابتة للتجميعات.

يمكنك استخدام الانعكاس لإلقاء نظرة على ناشر التجميع، وتنسيق ذلك مع مسار التجميع.إذا وجدت تجميعًا يكون ناشره Microsoft، وهو موجود في مكان ما أدناه C:\Windows\Microsoft.NET\Framework إنه رهان آمن، فهو جزء من وقت التشغيل.

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

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