首页 文章

在 生产环境 Windows Server上安装哪个版本的.NET的简单方法是什么?

提问于
浏览
98

这个问题与编程无关,因为它与部署相关 .

我发现自己与公司中的小组进行了很多交谈,他们的工作是维护我们的 生产环境 Windows服务器并在其上部署我们的代码 . 出于法律和合规性的原因,我没有直接的可见性或对服务器的任何控制,因此我可以通过我给该组的指示告诉我们在哪个版本上安装.NET的唯一方法 .

到目前为止,我可以想到的所有方法都可以告诉我们安装了哪个版本(检查管理工具是否匹配1.1或2.0,检查“添加/删除程序”列表中的条目,检查是否存在c:\ Windows \ Microsoft.NET下的目录是有缺陷的(我在管理工具下看到至少一台2.0但没有2.0条目的机器 - 而且该方法没有告诉你3.0,“添加/删除程序”列表可以与现实脱节,目录的存在并不一定意味着什么 .

鉴于我通常需要提前知道这些事情已经到位(发现“哎呀,这个没有你需要的所有版本和服务包”并不适用于短维护窗口)我必须检查“通过代理”,因为我无法直接进入服务器,什么是告诉 生产环境 Windows服务器上安装了哪个版本的.NET的万无一失的方法?最好使用框架安装的一些内在方法,因为它会更快,不需要某种实用程序加载,如果框架没有正确安装但仍然有文件就可以肯定会失败的方法(即,有一个目录和gacutil.exe在那里,但该框架的版本并没有真正“安装”)

EDIT: 由于没有一个很好的万无一失的内在方法来构建这个框架,有没有人知道一个好的,轻量级,无需安装的程序,可以找到这个?我可以想象有人可以轻松地写一个,但如果已经存在,那就更好了 .

19 回答

  • 1

    这里描述了检测.NET 3.0的官方方法

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

    有缺陷,因为它要求调用者具有注册表访问权限 .

    MSDN还提到了一种通过检查用户代理字符串来检测.NET 3.5的技术:

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

    我认为微软应该做得比这更好 .

  • 1

    好吧,就像Dean说的那样,你可以查看注册表并做他做的事情 . 要检查他是否确实安装了CLR .NET Framework,您应该在 %SystemRoot%\System32 目录中查找 MSCorEE.dll 文件 .

  • 0

    微软官方如何解决这个问题的答案在KB article 318785 .

  • 15

    您可以按照此blog entry以编程方式检查注册表和其他一些内容 .

    要查看的注册表项是

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

    如果要检查的计算机安装了.NET SDK,则可以使用SDK命令提示符并运行程序 CLRVer.exe .

  • 1

    要获得已安装的dotnet版本,
    创建一个控制台应用 . 添加此类运行它

    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
    }
    
  • 7

    here找到答案:

    检查安装了哪个.NET Framework版本

    打开命令提示符并复制粘贴以下命令行之一

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

    要么

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

    要确定服务器对 .NET Framework 4.5 and later 版本的支持(通过4.5.2测试): If you don't have Registry access on the server ,但拥有该服务器的应用程序发布权限,请创建一个带有简单控制器的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 . 如果您的服务器支持目标框架,那么简单的字符串将显示在您的普通控制器中 . 如果没有,您将收到如下错误:

    Example of unsupported .NET 4.5.2 on server

    所以在这种情况下,我的目标服务器还不支持.NET Framework 4.5.2 .

  • 19

    奇怪的是,当1.1出现时,我写了一些代码来实现这一点(七年前是什么?)并在2.0出现时稍微调整一下 . 多年来我没有看过它,因为我们不再管理我们的服务器 .

    这不是万无一失的,但无论如何我都会张贴它,因为我发现它很幽默;因为它在.NET中更容易,而且在动力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;
    }
    
  • 24

    找到版本可能是一种讨厌的方式,但我总是认为所有版本都已安装到 <root>:\WINDOWS\Microsoft.NET\Framework .

    这提供了名称为 v2.0.50727 的文件夹,我相信它会提供详细的版本信息 .

  • 15

    如果要查找.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");
    
            }
        }
    }
    

    然后,控制台结果将告诉您哪些版本已安装并可用于部署 . 此代码也派上用场,因为您可以将它们作为已保存的解决方案随时用于检查 .

  • 4

    另外,请参阅Stack Overflow问题How to detect what .NET Framework versions and service packs are installed?,其中还提到:

    在知识库文章[如何确定哪一个]中,Microsoft正式回答了这个问题安装Microsoft .NET Framework的版本和Service Pack级别] [2]

    文章编号:318785 - 最后修改:2008年11月7日 - 修订:20.1如何确定安装了哪些版本的.NET Framework以及是否已应用Service Pack .

    不幸的是,它似乎不起作用,因为2.0目录中的 mscorlib.dll 版本有2.0版本,并且3.0或3.5目录中没有 mscorlib.dll 版本,即使安装了3.5 SP1 ...为什么要官方微软答案是如此误导?

  • 3

    您应该在要查找此信息的服务器上打开IE,然后转到此站点:http://www.hanselman.com/smallestdotnet/

    这就是全部 .

    该站点有一个脚本,可以查看您的浏览器的“UserAgent”并找出您安装(或没有)安装的.NET Framework的版本(如果有),并自动显示(如果您选择,则计算总大小)下载.NET Framework) .

  • 0

    我进入Windows Update并查看了更新历史记录,知道服务器修补程序是最新的 . 我向下扫描了.NET更新,它向我展示了哪些版本有更新,这让我得出结论哪些版本已安装 .

  • 0

    OneTouch部署将执行所有先决条件的检测和安装 . 最好是采用预先制定的解决方案,而不是试图自己动手 . 尝试自己滚动可能会导致问题,因为您键入的任何内容都可能随修补程序或Service Pack而更改 . 可能微软有一些启发式方法来确定正在运行的版本 .

  • 0

    我发现这个非常有用 . 这是source

    enter image description here

  • 0

    根据CodeTrawler's answer,解决方案是在资源管理器窗口中输入以下内容:

    %systemroot%\ Microsoft.NET \ Framework

    然后搜索:

    Mscorlib.dll

    ...并右键单击/转到每个结果的版本选项卡 .

  • 1

    微软的方式是这样的:

    MSDN: How to determine Which .NET Framework Versions Are Installed(它会将您引导至以下注册表项: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\...

    如果你想要万无一失,这是另一回事 . 我不担心框架文件夹的xcopy . 如果有人这样做,我会认为电脑坏了 .

    最简单的方法是编写一个小程序,它使用每个版本的.NET和你关心的库并运行它们 .

    对于无安装方法,PowerBasic是一个很好的工具 . 它创建小的没有运行时所需的exe . 它可以自动执行上面MS KB文章中描述的检查 .

  • 54

    http://www.asoft.be/prod_netver.html

    使用这个“好,轻,无需安装的程序”

相关问题