أفضل طريقة لتحديد ما إذا كان تم تثبيت .NET 3.5 أم لا

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

سؤال

أحتاج إلى تحديد ما إذا كان قد تم تثبيت .NET 3.5 برمجيًا أم لا.كنت اعتقد انه سيكون سهل:

<% Response.Write(Environment.Version.ToString()); %>

الذي يُرجع "2.0.50727.1434" لذا لا يوجد مثل هذا الحظ...

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

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

المحلول

بامكانك ان تحاول:

static bool HasNet35()
{
    try
    {
        AppDomain.CurrentDomain.Load(
            "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
        return true;
    }
    catch
    {
        return false;
    }
}

@نيك:سؤال جيد، سأحاول ذلك بعد قليل.

كيف

نصائح أخرى

وذلك لأن .NET 3.5 من الناحية الفنية هو امتداد لإطار عمل 2.0.أسرع طريقة هي تضمين تجميع من .NET 3.5 ومعرفة ما إذا كان سيتعطل أم لا.

System.Web.Extensions

هو تجميع جيد تم تضمينه فقط في الإصدار 3.5.ويبدو أيضًا أنك تستخدم ASP.NET لتشغيل هذا الفحص، وهذا يحدك حقًا لأنك لن تتمكن من التحقق من نظام الملفات أو السجل الذي يعمل في الوضع المحمي لـ ASP.NET.أو يمكنك دائمًا محاولة تحميل تجميع من GAC والذي يجب أن يكون موجودًا فقط في .NET 3.5، ولكن قد تواجه مشكلات تتعلق بالأذونات مرة أخرى.

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

Kev، حقًا يعجبني الحل الذي تقدمه.شكرا للمساعدة.

باستخدام السجل، سيبدو الرمز كما يلي:

RegistryKey key = Registry
        .LocalMachine
        .OpenSubKey("Software\\Microsoft\\NET Framework Setup\\NDP\\v3.5");
return (key != null);

سأكون فضوليًا إذا كان أي منهما سيعمل في بيئة ثقة متوسطة (على الرغم من أنني أعمل بثقة كاملة لذا لا يهم ما أعمل عليه حاليًا).

@komradekatz، الحل الخاص بك أدناه من MSDN لتوفير الراحة للآخرين الذين يبحثون في هذا الأمر.لا أحب هذا الحل لأنه يستخدم وكيل المستخدم لتحديد الإصدار.هذا غير قابل للتطبيق بالنسبة لما أحتاج إليه (أنا أكتب مكتبة فصل دراسي تحتاج إلى معرفة ما إذا كان .NET 3.5 مثبتًا).وأتساءل أيضًا عن مدى موثوقية هذا الحل.

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<HTML>
  <HEAD>
    <TITLE>Test for the .NET Framework 3.5</TITLE>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" />
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var dotNETRuntimeVersion = "3.5.0.0";

    function window::onload()
    {
      if (HasRuntimeVersion(dotNETRuntimeVersion))
      {
        result.innerText = 
          "This machine has the correct version of the .NET Framework 3.5."
      } 
      else
      {
        result.innerText = 
          "This machine does not have the correct version of the .NET Framework 3.5." +
          " The required version is v" + dotNETRuntimeVersion + ".";
      }
      result.innerText += "\n\nThis machine's userAgent string is: " + 
        navigator.userAgent + ".";
    }

    //
    // Retrieve the version from the user agent string and 
    // compare with the specified version.
    //
    function HasRuntimeVersion(versionToCheck)
    {
      var userAgentString = 
        navigator.userAgent.match(/.NET CLR [0-9.]+/g);

      if (userAgentString != null)
      {
        var i;

        for (i = 0; i < userAgentString.length; ++i)
        {
          if (CompareVersions(GetVersion(versionToCheck), 
            GetVersion(userAgentString[i])) <= 0)
            return true;
        }
      }

      return false;
    }

    //
    // Extract the numeric part of the version string.
    //
    function GetVersion(versionString)
    {
      var numericString = 
        versionString.match(/([0-9]+)\.([0-9]+)\.([0-9]+)/i);
      return numericString.slice(1);
    }

    //
    // Compare the 2 version strings by converting them to numeric format.
    //
    function CompareVersions(version1, version2)
    {
      for (i = 0; i < version1.length; ++i)
      {
        var number1 = new Number(version1[i]);
        var number2 = new Number(version2[i]);

        if (number1 < number2)
          return -1;

        if (number1 > number2)
          return 1;
      }

      return 0;
    }

    -->
    </SCRIPT>
  </HEAD>

  <BODY>
    <div id="result" />
  </BODY>
</HTML>

على الجهاز الخاص بي هذه المخرجات:

يحتوي هذا الجهاز على الإصدار الصحيح من .NET Framework 3.5.

سلسلة userAgent لهذا الجهاز هي:موزيلا/4.0 (متوافق؛مسي 7.0؛ويندوز إن تي 6.0؛SLCC1؛.NET CLR 2.0.50727 ؛صافي كلر 3.0.04506؛InfoPath.2;صافي كلر 1.1.4322؛.NET CLR 3.5.21022 ؛زوني 2.5).

اكتشاف آخر مثير للاهتمام هو وجود التجميعات هنا:

C: Program Files Reference Assemblies Microsoft Framework v3.5

كنت تعتقد أن Microsoft ستقوم بإجراء فحص لـ "أحدث إصدار" في إطار العمل.

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

أيضًا، مع ClickOnce تحصل على التحديث مجانًا.لماذا لا يريد شخص ما استخدامه؟

لإعداد تطبيق ClickOnce، فقط انقر بزر الماوس الأيمن على المشروع داخل Visual Studio وانتقل إلى إعدادات النشر.سيؤدي هذا إلى إنشاء بنية خاصة لتطبيقك يمكنك وضعها على موقع الويب الخاص بك.عندما يقوم المستخدمون بتنزيل البرنامج، سيقوم المثبت بالتحقق من أي متطلبات أساسية مثل .Net بالنسبة لك.

أحد الخيارات هو اكتشاف 4.0 باستخدام سلسلة الإصدار:

    Environment.Version.CompareTo(new Version(4, 0));

وبما أن الإصدارين 2.0 و2.5 يشتركان في رقم إصدار CLR، فيجب تمييزهما عن طريق التحقق من السجل.نظرًا لأن هذه الإصدارات قد تم إصدارها بالفعل، فإن السلاسل التي يجب البحث عنها معروفة.

بدون أي استثناءات لتحميل التجميع والتقاطه (وهو أمر بطيء)، تحقق من تغييرات واجهة برمجة التطبيقات للفئة بين 2.0 و3.5. حالة الطبقة الأحادية مفيد جدًا لهذا الغرض.على سبيل المثال، يمكنك التحقق من ذلك GC.Collect Method (Int32, GCCollectionMode) وهو موجود في mscorlib وتمت إضافته في 3.5 .

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