อะไรคือวิธีที่เข้าใจผิดในการบอกว่า. NET เวอร์ชันใดที่ติดตั้งบน Windows Server ที่ใช้งานจริง


99

คำถามนี้ไม่เกี่ยวข้องกับการเขียนโปรแกรมมากนักเนื่องจากเกี่ยวข้องกับการปรับใช้

ฉันพบว่าตัวเองสนทนาบ่อยมากกับกลุ่มใน บริษัท ของฉันซึ่งมีหน้าที่ดูแลเซิร์ฟเวอร์ Windows ที่ใช้งานจริงและปรับใช้โค้ดของเรากับพวกเขา ด้วยเหตุผลทางกฎหมายและการปฏิบัติตามข้อกำหนดฉันไม่มีการเปิดเผยโดยตรงหรือการควบคุมใด ๆ เกี่ยวกับเซิร์ฟเวอร์ดังนั้นวิธีเดียวที่ฉันจะบอกได้ว่ามีการติดตั้ง. NET เวอร์ชันใดในเวอร์ชันใดก็ตามคือผ่านคำแนะนำที่ฉันให้กับกลุ่มนั้น

จนถึงตอนนี้วิธีการทั้งหมดที่ฉันคิดได้เพื่อบอกว่ามีการติดตั้งเวอร์ชันใด (ตรวจสอบเครื่องมือการดูแลระบบที่ตรงกับ 1.1 หรือ 2.0 ตรวจสอบรายการในรายการ "เพิ่ม / ลบโปรแกรม" ตรวจสอบการมีอยู่ของ ไดเร็กทอรีภายใต้ c: \ Windows \ Microsoft.NET) มีข้อบกพร่อง (ฉันเคยเห็นอย่างน้อยหนึ่งเครื่องที่มี 2.0 แต่ไม่มีรายการ 2.0 ภายใต้เครื่องมือการดูแลระบบ - และวิธีนี้ไม่ได้บอกอะไรเกี่ยวกับ 3.0+ รายการ "เพิ่ม / ลบโปรแกรม" อาจไม่สอดคล้องกับความเป็นจริงและการมีอยู่ของไดเรกทอรีไม่จำเป็นต้องมีความหมายอะไรเลย)

เนื่องจากโดยทั่วไปฉันจำเป็นต้องรู้สิ่งเหล่านี้ล่วงหน้า (เมื่อพบว่า "อ๊ะอันนี้ไม่มีเวอร์ชันและเซอร์วิสแพ็คทั้งหมดที่คุณต้องการ" ทำงานได้ไม่ดีกับช่วงเวลาการบำรุงรักษาสั้น ๆ ) และฉันต้อง ทำการตรวจสอบ "โดยพร็อกซี" เนื่องจากฉันไม่สามารถเข้าถึงเซิร์ฟเวอร์ได้โดยตรงมีวิธีใดที่จะบอกได้ว่า. NET เวอร์ชันใดที่ติดตั้งบน Windows Server ที่ใช้งานจริง โดยเฉพาะอย่างยิ่งวิธีที่แท้จริงในการทำเช่นนั้นโดยใช้สิ่งที่เฟรมเวิร์กติดตั้งเนื่องจากจะเร็วกว่าและไม่จำเป็นต้องโหลดยูทิลิตี้บางประเภทและยังเป็นวิธีการที่จะล้มเหลวอย่างแน่นอนหากติดตั้งเฟรมเวิร์กไม่ถูกต้อง แต่ยังมีไฟล์อยู่ (เช่น มีไดเร็กทอรีและ gacutil.exe อยู่ในนั้น แต่เฟรมเวิร์กเวอร์ชันนั้นไม่ได้ "ติดตั้ง")

แก้ไข:ในกรณีที่ไม่มีวิธีการภายในที่เข้าใจผิดในการทำสิ่งนี้ที่มีอยู่ใน Framework (s) มีใครรู้จักโปรแกรมที่ดีน้ำหนักเบาไม่ต้องติดตั้งที่สามารถค้นหาสิ่งนี้ได้หรือไม่? ฉันนึกภาพออกว่าใครบางคนสามารถเขียนได้อย่างง่ายดาย แต่ถ้ามีอยู่แล้วจะดีกว่านี้


1
ฉันมองย้อนกลับไปในขณะนี้และไม่พบวิธีที่ชัดเจนในการทำเช่นนี้ ฉันสนใจที่จะดูว่าเราได้รับคำตอบอะไรบ้าง
Kev

อาจซ้ำกันได้ของวิธีการตรวจหารุ่น. NET Framework และเซอร์วิสแพ็คที่ติดตั้งไว้ - คำถามที่ยอมรับได้ (แม้ว่าจะมีอายุน้อยกว่า 17 วัน)
Peter Mortensen

คำตอบ:


54

คุณควรเปิด IE บนเซิร์ฟเวอร์ที่คุณกำลังค้นหาข้อมูลนี้และไปที่เว็บไซต์นี้: http://www.hanselman.com/smlestdotnet/

นั่นคือทั้งหมดที่ต้องใช้

ไซต์นี้มีสคริปต์ที่มีลักษณะเป็น "UserAgent" ของเบราว์เซอร์ของคุณและระบุว่าเวอร์ชันใด (ถ้ามี) ของ. NET Framework ที่คุณติดตั้ง (หรือไม่มี) และแสดงโดยอัตโนมัติ (จากนั้นจะคำนวณขนาดทั้งหมดหากคุณเลือก เพื่อดาวน์โหลด. NET Framework)


19
- หากเป็นเซิร์ฟเวอร์ที่ใช้งานจริงเขาอาจไม่สามารถเข้าถึงได้ - การเรียกดูไซต์แบบสุ่มบนเซิร์ฟเวอร์ prod ถือเป็นเรื่องที่ไม่สำคัญมาก - ไซต์นั้นให้เวอร์ชัน. Net สูงสุดเท่านั้น เขาต้องการทั้งหมด
Franci Penov

1
ปัญหาดูเหมือนด้วยวิธีการนั้นคือจะบอกคุณว่าเวอร์ชันล่าสุดที่คุณมีคืออะไร ฉันปรับใช้โค้ดใน 2.0, 3.0, 3.5 และ (น่าเศร้า) แม้กระทั่ง 1.1 แม้ว่าเป้าหมายคือการอัปเกรดทุกอย่างในที่สุดความจริงที่น่าเศร้าสำหรับตอนนี้ก็คือฉันต้องการเวอร์ชันคู่ขนานที่แตกต่างกันทั้งหมด
Tom Kidd

1
แม้ว่าฉันยอมรับว่าโซลูชันนี้อาจไม่เหมาะสมสำหรับเซิร์ฟเวอร์ที่ใช้งานจริง แต่ฉันก็โหวตให้เพราะเป็นวิธีที่ง่ายและรวดเร็วที่สุดสำหรับเครื่องพัฒนา (ซึ่งฉันเคยใช้บ่อยๆ) เวอร์ชันปัจจุบันของสคริปต์สามารถตรวจพบ. NET เวอร์ชันต่างๆที่ฉันติดตั้งได้สำเร็จ
kmote

ผู้ใช้สตริงตัวแทนจาก URL ที่ให้: Mozilla / 5.0 (เข้ากันได้; MSIE 10.0; Windows NT 6.1; WOW64; ตรีศูล / 6.0) Bu-ga-ga ดังนั้น. NET Framework เวอร์ชันใดบ้างที่ติดตั้ง? เพื่อให้ได้ผลลัพธ์ที่คาดหวังจำเป็นต้องเปลี่ยน IE เป็นโหมดที่เข้ากันได้
Mosc

1
สก็อตต์แฮนเซลแมนได้สร้างความเชื่อมั่นโดยสุจริตของเขาดังนั้นฉันจะไม่เรียกมันว่า "สุ่มไซต์" (นอกจากนี้เขายังทำให้ซอร์สโค้ดพร้อมใช้งาน) แต่แอพนี้ต้องใช้การเชื่อมต่ออินเทอร์เน็ตซึ่งโฮสต์ที่ล็อคใน a-Faraday-cage มักขาด
Robert Calhoun

24

คุณสามารถตรวจสอบรีจิสทรีโดยใช้โปรแกรมและสิ่งอื่น ๆ ตามรายการบล็อกนี้นี้

คีย์รีจิสทรีที่ต้องดูคือ

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...]

ฉันบอกไม่ได้ - นี่ครอบคลุม 1.1 ด้วยหรือเปล่า
Tom Kidd

1
ฉันสามารถดูรายละเอียด 1.1 ภายใต้คีย์รีจิสทรีนี้ในระบบของฉันดังนั้นฉันจะบอกว่ามันครอบคลุม 1.1
Niall Connaughton

ใช่มองภายใต้ ... \ NDP \ v4 \ Full \ จากนั้นในเวอร์ชันที่ ฉันเห็นว่าฉันมี v 4.5.5 ... TargetVersionตั้งไว้ที่ 4.0.0
ปิดทอง

19

พบคำตอบจากที่นี่ :

ตรวจสอบว่ามีการติดตั้ง. NET Framework เวอร์ชันใด

เปิด Command Prompt แล้วคัดลอกและวางบรรทัดคำสั่งด้านล่าง

dir %WINDIR%\Microsoft.Net\Framework\v*

หรือ

dir %WINDIR%\Microsoft.Net\Framework\v* /O:-N /B

สิ่งที่ฉันต้องการ
PandaWood

13
4.5 และ 4.5.1 ได้รับการติดตั้งแทนที่ 4.0 ดังนั้นการแก้ปัญหานี้อาจทำให้เข้าใจผิดได้ msdn.microsoft.com/en-us/library/5a4x27ek%28v=vs.110%29.aspx
Nick Patsaris

15

ตามคำตอบของ CodeTrawlerวิธีแก้ปัญหาคือป้อนสิ่งต่อไปนี้ลงในหน้าต่าง explorer:

% systemroot% \ Microsoft.NET \ Framework

จากนั้นค้นหา:

Mscorlib.dll

... และคลิกขวา / ไปที่แท็บเวอร์ชันสำหรับแต่ละผลลัพธ์


นี่เป็นวิธีที่ง่ายที่สุดในการแยกความแตกต่างระหว่างเวอร์ชัน 4 / 4.5+ มิฉะนั้นสำหรับภาพรวมของสิ่งที่ติดตั้งคำตอบ @ K.Dias ใช้ได้กับฉัน: dir% windir% \ microsoft.net \ framework \ v * / O : -N / B
Timothy Lee Russell

15

วิธีของ Microsoft คือ:

MSDN: วิธีการตรวจสอบรุ่นซึ่ง .NET Framework มีการติดตั้ง (ซึ่งนำคุณไปยังรีจิสทรีคีย์ต่อไปนี้: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...)

หากคุณต้องการความเข้าใจผิดนั่นเป็นอีกเรื่องหนึ่ง ฉันไม่ต้องกังวลกับ xcopy ของโฟลเดอร์ framework ถ้ามีใครทำแบบนั้นฉันจะถือว่าคอมพิวเตอร์พัง

วิธีที่ป้องกันไม่ได้มากที่สุดคือการเขียนโปรแกรมขนาดเล็กที่ใช้. NET แต่ละเวอร์ชันและไลบรารีที่คุณสนใจและเรียกใช้

สำหรับวิธีการไม่ติดตั้งPowerBasicเป็นเครื่องมือที่ยอดเยี่ยม มันสร้าง exe ขนาดเล็กไม่จำเป็นต้องรันไทม์ สามารถทำการตรวจสอบโดยอัตโนมัติที่อธิบายไว้ในบทความ MS KB ด้านบน


วิธีนี้ใช้ไม่ได้กับเวอร์ชัน 4.5.1 ขึ้นไปอีกต่อไป
Scott Solmer

@ Okuma.Scott - ฉันได้อัปเดตลิงก์ไปยังคำแนะนำ MSDN อย่างเป็นทางการ
kmote


3

หากเครื่องที่คุณต้องการตรวจสอบมีการติดตั้ง. NET SDK คุณสามารถใช้พรอมต์คำสั่ง SDK และเรียกใช้โปรแกรมCLRVer.exeได้


1
มีปัญหา (การให้สิทธิ์การใช้งาน) ในการปรับใช้ไฟล์ปฏิบัติการนั้นหรือไม่? ไม่มีการอ้างอิงใด ๆ ที่จะพูดถึง

1
clrver ไม่มีประโยชน์เพราะมันอยู่ มันบอกว่า 4.0. * สำหรับ 4.5 / 4.6
Roman Starkov


1

การปรับใช้ OneTouch จะทำการตรวจจับและติดตั้งข้อกำหนดเบื้องต้นทั้งหมด อาจเป็นการดีที่สุดที่จะใช้โซลูชันที่สร้างไว้ล่วงหน้าแทนที่จะพยายามม้วนของคุณเอง การพยายามม้วนของคุณเองอาจทำให้เกิดปัญหาได้เนื่องจากสิ่งที่คุณป้อนอาจเปลี่ยนแปลงด้วยโปรแกรมแก้ไขด่วนหรือเซอร์วิสแพ็ค Microsoft มีแนวโน้มที่จะมีการแก้ปัญหาบางอย่างสำหรับการพิจารณาว่าเวอร์ชันใดกำลังทำงานอยู่


1

วิธีอย่างเป็นทางการในการตรวจจับ. NET 3.0 มีอธิบายไว้ที่นี่

http://msdn.microsoft.com/en-us/library/aa480198.aspx

มีข้อบกพร่องเนื่องจากผู้โทรต้องมีสิทธิ์เข้าถึงรีจิสทรี

MSDN ยังกล่าวถึงเทคนิคในการตรวจจับ. NET 3.5 โดยการตรวจสอบสตริง User Agent:

http://msdn.microsoft.com/en-us/library/bb909885.aspx

ฉันคิดว่า Microsoft น่าจะทำงานได้ดีกว่านี้


1

นอกจากนี้โปรดดูที่คำถาม Stack Overflow จะตรวจหารุ่น. NET Framework และ Service Pack ที่ติดตั้งได้อย่างไร? ซึ่งกล่าวถึง:

มีคำตอบอย่างเป็นทางการของ Microsoft สำหรับคำถามนี้ในบทความฐานความรู้[วิธีการตรวจสอบว่ามีการติดตั้ง Microsoft .NET Framework เวอร์ชันและระดับบริการใดบ้าง] [2]

รหัสบทความ: 318785 - ตรวจทานครั้งล่าสุด: 7 พฤศจิกายน 2551 - ฉบับแก้ไข: 20.1 วิธีตรวจสอบว่ามีการติดตั้ง. NET Framework เวอร์ชันใดและมีการใช้เซอร์วิสแพ็คหรือไม่

น่าเสียดายที่ดูเหมือนว่าจะใช้งานไม่ได้เนื่องจากmscorlib.dllเวอร์ชันในไดเร็กทอรี 2.0 มีเวอร์ชัน 2.0 และไม่มีmscorlib.dllเวอร์ชันในไดเร็กทอรี 3.0 หรือ 3.5 แม้ว่าจะติดตั้ง 3.5 SP1 แล้วก็ตาม ... ทำไมคำตอบอย่างเป็นทางการของ Microsoft จึงเป็น เข้าใจผิดอย่างนั้นเหรอ?


1

เพื่อตรวจสอบการสนับสนุนเซิร์ฟเวอร์ของคุณสำหรับ. NET Framework 4.5 และเวอร์ชันที่ใหม่กว่า (ทดสอบถึง 4.5.2): หากคุณไม่มีสิทธิ์เข้าถึง Registry บนเซิร์ฟเวอร์แต่มีสิทธิ์เผยแพร่แอปไปยังเซิร์ฟเวอร์นั้นให้สร้างแอป MVC 5 ด้วยเรื่องเล็กน้อย ตัวควบคุมเช่นนี้:

using System.Web.Mvc;

namespace DotnetVersionTest.Controllers
{
    public class DefaultController : Controller
    {
        public string Index()
        {
            return "simple .NET version test...";
        }
    }
}

จากนั้นใน Web.config ของคุณให้เดินผ่าน. NET Framework เวอร์ชันที่ต้องการในส่วนต่อไปนี้โดยเปลี่ยนtargetFrameworkค่าตามต้องการ:

<system.web>
    <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.5.2"/>
    <httpRuntime targetFramework="4.5.2"/>
</system.web>

<app deploy URL>/Defaultเผยแพร่ในแต่ละเป้าหมายไปยังเซิร์ฟเวอร์ของคุณจากนั้นเรียกดู หากเซิร์ฟเวอร์ของคุณรองรับเฟรมเวิร์กเป้าหมายสตริงธรรมดาจะแสดงจากตัวควบคุมเล็กน้อยของคุณ มิฉะนั้นคุณจะได้รับข้อผิดพลาดดังต่อไปนี้:

ตัวอย่างของ. NET 4.5.2 ที่ไม่รองรับบนเซิร์ฟเวอร์

ดังนั้นในกรณีนี้เซิร์ฟเวอร์เป้าหมายของฉันยังไม่รองรับ. NET Framework 4.5.2


1

หากต้องการรับเวอร์ชันดอทเน็ตที่ติดตั้งให้
สร้างแอปคอนโซล เพิ่มคลาสนี้ Run that

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    public class GetDotNetVersion
    {
        public static void Get45PlusFromRegistry()
        {
            const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
            using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
            {
                if (ndpKey != null && ndpKey.GetValue("Release") != null)
                {
                    Console.WriteLine(".NET Framework Version: " + CheckFor45PlusVersion((int)ndpKey.GetValue("Release")));
                }
                else
                {
                    Console.WriteLine(".NET Framework Version 4.5 or later is not detected.");
                }
            }
        }

        // Checking the version using >= will enable forward compatibility.
        private static string CheckFor45PlusVersion(int releaseKey)
        {
            if (releaseKey >= 394802)
                return "4.6.2 or later";
            if (releaseKey >= 394254)
            {
                return "4.6.1";
            }
            if (releaseKey >= 393295)
            {
                return "4.6";
            }
            if ((releaseKey >= 379893))
            {
                return "4.5.2";
            }
            if ((releaseKey >= 378675))
            {
                return "4.5.1";
            }
            if ((releaseKey >= 378389))
            {
                return "4.5";
            }
            // This code should never execute. A non-null release key shoul
            // that 4.5 or later is installed.
            return "No 4.5 or later version detected";
        }
    }
    // Calling the GetDotNetVersion.Get45PlusFromRegistry method produces 
    // output like the following:
    //       .NET Framework Version: 4.6.1
}

เวอร์ชั่นล่าสุด 4.7.2?
Kiquenet

0

น่าแปลกที่ฉันเขียนโค้ดเพื่อทำสิ่งนี้เมื่อ 1.1 ออกมา (นั่นคืออะไรเมื่อเจ็ดปีที่แล้ว?) และปรับแต่งเล็กน้อยเมื่อ 2.0 ออกมา ฉันไม่ได้ดูมาหลายปีแล้วเพราะเราไม่ได้จัดการเซิร์ฟเวอร์ของเราอีกต่อไป

มันไม่สามารถเข้าใจผิดได้ แต่ฉันโพสต์ไว้เพราะฉันคิดว่ามันเป็นเรื่องตลก ซึ่งง่ายกว่าที่จะทำใน. NET และยังง่ายกว่าใน power shell

bool GetFileVersion(LPCTSTR filename,WORD *majorPart,WORD *minorPart,WORD *buildPart,WORD *privatePart)
{
    DWORD dwHandle;
    DWORD dwLen = GetFileVersionInfoSize(filename,&dwHandle);
    if (dwLen) {
        LPBYTE lpData = new BYTE[dwLen];
        if (lpData) {
            if (GetFileVersionInfo(filename,0,dwLen,lpData)) {
                UINT uLen;  
                VS_FIXEDFILEINFO *lpBuffer;  
                VerQueryValue(lpData,_T("\\"),(LPVOID*)&lpBuffer,&uLen);  
                *majorPart = HIWORD(lpBuffer->dwFileVersionMS);
                *minorPart = LOWORD(lpBuffer->dwFileVersionMS);
                *buildPart = HIWORD(lpBuffer->dwFileVersionLS);
                *privatePart = LOWORD(lpBuffer->dwFileVersionLS);
                delete[] lpData;
                return true;
            }
        }
    }
    return false;
}

int _tmain(int argc,_TCHAR* argv[])
{
    _TCHAR filename[MAX_PATH];
    _TCHAR frameworkroot[MAX_PATH];
    if (!GetEnvironmentVariable(_T("systemroot"),frameworkroot,MAX_PATH))
        return 1;
    _tcscat_s(frameworkroot,_T("\\Microsoft.NET\\Framework\\*"));
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = FindFirstFile(frameworkroot,&FindFileData);
    if (hFind == INVALID_HANDLE_VALUE)
        return 2;
    do {
        if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
            _tcslen(FindFileData.cAlternateFileName) != 0) {
            _tcsncpy_s(filename,frameworkroot,_tcslen(frameworkroot)-1);
            filename[_tcslen(frameworkroot)] = 0;
            _tcscat_s(filename,FindFileData.cFileName);
            _tcscat_s(filename,_T("\\mscorlib.dll"));
            WORD majorPart,minorPart,buildPart,privatePart;
            if (GetFileVersion(filename,&majorPart,&minorPart,&buildPart,&privatePart )) {
                _tprintf(_T("%d.%d.%d.%d\r\n"),majorPart,minorPart,buildPart,privatePart);
            }
        }
    } while (FindNextFile(hFind,&FindFileData) != 0);
    FindClose(hFind);
    return 0;
}

0

อย่างที่คณบดีพูดคุณสามารถดูรีจิสทรีและทำในสิ่งที่เขาทำ ในการตรวจสอบว่าเขาติดตั้ง CLR .NET Framework หรือไม่คุณควรมองหาMSCorEE.dllไฟล์ใน%SystemRoot%\System32ไดเร็กทอรี


0

มันอาจจะเป็นวิธีที่น่ารังเกียจที่จะหาเวอร์ชั่นที่ออกมา <root>:\WINDOWS\Microsoft.NET\Frameworkแต่ผมก็มักจะรู้สึกว่าทุกรุ่นได้รับการติดตั้งให้

สิ่งนี้ให้โฟลเดอร์ที่มีชื่อv2.0.50727ที่ฉันเชื่อว่าให้ข้อมูลเวอร์ชันโดยละเอียด


1
และนั่นอาจจะเป็นวิธีที่ถูกต้อง แต่ "จะเกิดอะไรขึ้นถ้า" ในหัวของฉันพูดว่า "จะเกิดอะไรขึ้นถ้าไฟล์อยู่ที่นั่น แต่ Framework ไม่ได้ 'ติดตั้ง' จริงๆและผู้ดูแลระบบบางคนก็คิดว่าการคัดลอกไฟล์ไปเป็นวิธีที่จะทำได้?
Tom Kidd

0

หากคุณต้องการค้นหาเวอร์ชันก่อนหน้า. NET 4.5 ให้ใช้โค้ดสำหรับแอปพลิเคชันคอนโซล แบบนี้:

using System;
using System.Security.Permissions;
using Microsoft.Win32;

namespace findNetVersion
{
    class Program
    {
        static void Main(string[] args)
        {
            using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                     RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
            {
                foreach (string versionKeyName in ndpKey.GetSubKeyNames())
                {
                    if (versionKeyName.StartsWith("v"))
                    {

                        RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
                        string name = (string)versionKey.GetValue("Version", "");
                        string sp = versionKey.GetValue("SP", "").ToString();
                        string install = versionKey.GetValue("Install", "").ToString();
                        if (install == "") //no install info, must be later version
                            Console.WriteLine(versionKeyName + "  " + name);
                        else
                        {
                            if (sp != "" && install == "1")
                            {
                                Console.WriteLine(versionKeyName + "  " + name + "  SP" + sp);
                            }
                        }
                        if (name != "")
                        {
                            continue;
                        }
                        foreach (string subKeyName in versionKey.GetSubKeyNames())
                        {
                            RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
                            name = (string)subKey.GetValue("Version", "");
                            if (name != "")
                                sp = subKey.GetValue("SP", "").ToString();
                                install = subKey.GetValue("Install", "").ToString();
                            if (install == "") //no install info, ust be later
                                Console.WriteLine(versionKeyName + "  " + name);
                            else
                            {
                                if (sp != "" && install == "1")
                                {
                                    Console.WriteLine("  " + subKeyName + "  " + name + "  SP" + sp);
                                }
                                else if (install == "1")
                                {
                                    Console.WriteLine("  " + subKeyName + "  " + name);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

มิฉะนั้นคุณจะพบ. NET 4.5 หรือใหม่กว่าโดยการค้นหาดังนี้:

private static void Get45or451FromRegistry()
{
    using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
       RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"))
    {
        int releaseKey = (int)ndpKey.GetValue("Release");
        {
            if (releaseKey == 378389)

                Console.WriteLine("The .NET Framework version 4.5 is installed");

            if (releaseKey == 378758)

                Console.WriteLine("The .NET Framework version 4.5.1  is installed");

        }
    }
}

จากนั้นผลลัพธ์ของคอนโซลจะบอกคุณว่าเวอร์ชันใดบ้างที่ติดตั้งและพร้อมใช้งานกับการปรับใช้ของคุณ รหัสนี้มีประโยชน์เช่นกันเพราะคุณมีไว้เป็นโซลูชันที่บันทึกไว้สำหรับทุกเวลาที่คุณต้องการตรวจสอบในอนาคต


อย่างไรก็ตามคุณอาจต้องการตั้งค่า Main เป็นส่วนตัวเช่นนี้: private static void Main (string [] args) {}
Ronnie Petty

นี่เป็นวิธีที่ Microsoft วางไว้บน MSDN msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx
Ronnie Petty

0

ฉันเข้าไปใน Windows Update และดูประวัติการอัปเดตโดยทราบว่าการแก้ไขเซิร์ฟเวอร์นั้นได้รับการอัปเดตอยู่เสมอ ฉันสแกนหาการอัปเดต. NET และแสดงให้ฉันเห็นว่าเวอร์ชันใดมีการอัปเดตซึ่งทำให้ฉันสรุปได้ว่าติดตั้งเวอร์ชันใด


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.