سؤال

لدي DLL قديم تم تجميعه مقابل .NET Framework ونشره. لست متأكدًا من إصدار .NET Framework الذي تم تجميعه. أتساءل كيف يمكنني تحديد إصدار .NET Framework الذي تم تجميعه DLL؟ لا يمكنني الوثوق بالرمز المصدري لأنني أعتقد أنه تمت ترقيته إلى Visual Studio 2008 وتغييره إلى .NET Framework الإصدار 3.5.

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

المحلول

تحميله في العاكس وانظر ماذا تشير؟

فمثلا:

enter image description here

نصائح أخرى

في PowerShell ، يمكنك استخدام ما يلي للحصول على وقت التشغيل المستهدف:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

لقد قمت بتكييف هذا إلى PowerShell من إجابة بن جريسوولد.

إذا كنت تريد معرفة إصدار الإطار الهدف المحدد في Visual Studio ، استخدم:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value

يجب أن تحصل على شيء مثل

.Netframework ، الإصدار = v4.5.2

dotpeek هي أداة رائعة (مجانية) لإظهار هذه المعلومات.

إذا كنت تواجه بعض المشكلات في الحصول على عاكس ، فهذا بديل جيد.

enter image description here

يمكنك استخدام ildasm...

ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil

وتحقق من "قسم البيانات الوصفية" في الإخراج. سيكون شيئًا من هذا القبيل:

قسم البيانات الوصفية: 0x424A5342 ، الإصدار: 1.1 ، إضافي: 0 ، إصدار لين: 12 ، الإصدار: v4.0.30319

سوف تخبرك علامة "الإصدار" بإصدار .NET Framework. في المثال أعلاه هو 4.0.30319

لديك بعض الخيارات: للحصول عليها برمجيًا ، من التعليمات البرمجية المدارة ، استخدم Assembly.Imageruntimeversion:

Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

من سطر الأوامر ، بدءًا من الإصدار 2.0 ، سيعرضه ildasm.exe إذا قمت بالنقر نقرًا مزدوجًا على "بيان" وابحث عن "إصدار بيانات التعريف". تحديد إصدار CLR للصورة

استخدم ilspy http://ilspy.net/

المصدر المفتوح ، مجانًا ، بالتأكيد خيار منذ أن يتم دفع عاكس الآن.

بتلك البساطة

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();

خيار آخر عبر Visual Studio ، أضف مرجعًا إلى DLL إلى أي مشروع ، ثم النقر بزر الماوس الأيمن على المرجع الجديد وانقر فوق خصائص ، يمكنك رؤية ما تبحث عنه في إصدار وقت التشغيل:

enter image description here

قم بتدوينه باستخدام ildasm ، وانظر إلى إصدار mscorlib الذي يتم الرجوع إليه (يجب أن يكون إلى حد كبير في الأعلى).

اذا كنت تمتلك DotPeek من JetBrains, ، يمكنك رؤيته في Assembly Explorer.

Can you see this screenshot? im not:(

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

using System.Reflection;
using System.Runtime.Versioning;
// ...
{
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
    var asm = System.Reflection.Assembly.LoadFrom(@"C:\Codez\My.dll");
    var targetFrameAttribute = asm.GetCustomAttributes(true).OfType<TargetFrameworkAttribute>().FirstOrDefault();
    targetFrameAttribute.Dump();
}

Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    var name = args.Name;

    if (name.StartsWith("Depends"))
        return System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"C:\Codez\Depends.dll");

    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}

المرجعي: https://weblog.west-wind.com/posts/2006/dec/22/reflection-on-problem-assemblies

لقد كتبت بسرعة تطبيق وحدة التحكم C# للقيام بذلك:

https://github.com/stuartjsmith/binaryDetailer

ما عليك سوى تمرير دليل كمعلمة وسيبذل قصارى جهده لإخبارك بالإطار الصافي لكل DLL و EXE هناك

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