كيف يمكن معرفة إصدار .NET Framework الذي يحتاج الملف القابل للتنفيذ إلى تشغيله؟

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

  •  11-07-2019
  •  | 
  •  

سؤال

لدي ملف قابل للتنفيذ، وأود أن أعرف أي إصدارات إطار عمل .NET يحتاج هذا الملف إلى البدء.

هل هناك طريقة سهلة للعثور على هذه المعلومات في مكان ما؟

(حتى الآن حاولت إلداسم و سلة المهملات دون أي حظ.)

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

المحلول

أعتقد أن أقرب ما يمكنك الحصول عليه بشكل موثوق هو تحديد إصدار CLR مطلوب.يمكنك القيام بذلك عن طريق استخدام ILDASM والنظر إلى العقدة "MANIFEST" أو العاكس والنظر إلى طريقة عرض التفكيك للعقدة "Application.exe" كـ IL.وفي كلتا الحالتين يوجد تعليق يشير إلى إصدار CLR.في ILDASM، التعليق هو "// إصدار بيانات التعريف" وفي العاكس التعليق هو "إصدار وقت التشغيل المستهدف".

فيما يلي أمثلة لتطبيق .NET WinForms المسمى WindowsFormsApplication1.exe:

إيلدام:

// Metadata version: v2.0.50727
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}
.assembly extern System
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}

العاكس:

.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727

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

مرة أخرى، باستخدام ILDASM بالنظر إلى بيانات العقدة "MANIFEST":

.assembly extern System.Drawing
{
  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         // .?_....:
  .ver 2:0:0:0
}
.assembly extern System.Core
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 3:5:0:0
}

وباستخدام العاكس، انظر إلى التفكيك (لا يزال كـ IL) لكل مرجع مدرج:

.assembly extern System.Core
{
    .ver 3:5:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}

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

نصائح أخرى

استخدام المفكرة, ، عمرها ثلاثة عقود، وحجمها 200 كيلو بايت، وهي أداة مثبتة مسبقًا:

  • فتح التطبيق مع notepad appname.exe,
  • بحث عن كلمة "الإطار"
  • كرر البحث الأخير مع F3 حتى .NET Framework,version=vX.Y يظهر
  • إذا لم يتم العثور على أي شيء (الإصدارات أقل من 3.0) فابحث عنه v2. ...لا يزال الأمر أسهل 100 مرة من تثبيت غيغابايت من أدوات تحليل dot net واستوديوهات البيانات المهملة.

يمكن لأي محرر/عارض آخر فتح الثنائيات أيضًا، مثل Notepad++ أو عارض النصوص/الست عشري الرائع الخاص بـ TotalCommander ليستر.

واتباع نهج أكثر بساطة سيكون لاستخدام dotPeek ونرى ما يظهر في الشجرة.

وانظر لوحة الخصائص:

ويمكنك الآن استخدام ILSpy لدراسة الإطار الهدف من تجميع. بعد تحميل التجميع، انقر على جذر العقدة التجمع، ويمكنك العثور على المعلومات في إطار إعلان TargetFramework:

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]

من الكود يمكنك استخدامه Assembly.ImageRuntimeVersion ولكن من خلال النظر إلى الملف، ربما يكون أفضل ما يمكنك فعله هو استخدام العاكس ومعرفة إصداره mscorlib يتم الرجوع إليها.

يحرر: والأفضل من ذلك هو الاستخدام ildasm, ، افتح التجميع الخاص بك ثم قم بعرض البيان الخاص بالتجميع.سيخبرك السطر الأول من البيان بالضبط إصدار CLR الذي تم إنشاء التجميع من أجله.

ويمكنك استخدام أداة تسمى CorFlags.exe. وقد حول منذ الصافي 2.0، وأنا أعلم يقينا أن يتم تضمينه في ويندوز SDK 7.0. بشكل افتراضي (على ويندوز إكس بي برو) يتم تثبيته على C: \ Files \ Microsoft برنامج تطوير البرامج \ ويندوز \ v7.0A \ بن \ CorFlags.exe. تزويدها مسار الملف إلى وحدة نمطية تمكنت (بدون أي أعلام سطر الأوامر الأخرى) لعرض معلومات رأس، والذي يتضمن إصدار.

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

ومن سطر الأوامر: find "Framework" MyApp.exe

أو يمكنك أن تجد للتو الذي مرجعية System.Core لديه. سوف إخبارك عن إصدار .NET Framework هذا التطبيق يستخدم. ل 2.0 إصدار System.Core سيكون 2.0.xxx.xxx. مقابل 3.5 سوف يكون الإصدار 3.5.xxx.xxx، وما إلى ذلك.

في لينكس / OSX / يونيكس يمكنك استخدام:

strings that_app.exe | grep 'v2.\|Framework'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top