这个问题与编程无关,因为它与部署相关 .
我发现自己与公司中的小组进行了很多交谈,他们的工作是维护我们的 生产环境 Windows服务器并在其上部署我们的代码 . 出于法律和合规性的原因,我没有直接的可见性或对服务器的任何控制,因此我可以通过我给该组的指示告诉我们在哪个版本上安装.NET的唯一方法 .
到目前为止,我可以想到的所有方法都可以告诉我们安装了哪个版本(检查管理工具是否匹配1.1或2.0,检查“添加/删除程序”列表中的条目,检查是否存在c:\ Windows \ Microsoft.NET下的目录是有缺陷的(我在管理工具下看到至少一台2.0但没有2.0条目的机器 - 而且该方法没有告诉你3.0,“添加/删除程序”列表可以与现实脱节,目录的存在并不一定意味着什么 .
鉴于我通常需要提前知道这些事情已经到位(发现“哎呀,这个没有你需要的所有版本和服务包”并不适用于短维护窗口)我必须检查“通过代理”,因为我无法直接进入服务器,什么是告诉 生产环境 Windows服务器上安装了哪个版本的.NET的万无一失的方法?最好使用框架安装的一些内在方法,因为它会更快,不需要某种实用程序加载,如果框架没有正确安装但仍然有文件就可以肯定会失败的方法(即,有一个目录和gacutil.exe在那里,但该框架的版本并没有真正“安装”)
EDIT: 由于没有一个很好的万无一失的内在方法来构建这个框架,有没有人知道一个好的,轻量级,无需安装的程序,可以找到这个?我可以想象有人可以轻松地写一个,但如果已经存在,那就更好了 .
19 回答
这里描述了检测.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
我认为微软应该做得比这更好 .
好吧,就像Dean说的那样,你可以查看注册表并做他做的事情 . 要检查他是否确实安装了CLR .NET Framework,您应该在
%SystemRoot%\System32
目录中查找MSCorEE.dll
文件 .微软官方如何解决这个问题的答案在KB article 318785 .
您可以按照此blog entry以编程方式检查注册表和其他一些内容 .
要查看的注册表项是
如果要检查的计算机安装了.NET SDK,则可以使用SDK命令提示符并运行程序
CLRVer.exe
.要获得已安装的dotnet版本,
创建一个控制台应用 . 添加此类运行它
从here找到答案:
打开命令提示符并复制粘贴以下命令行之一
要么
要确定服务器对 .NET Framework 4.5 and later 版本的支持(通过4.5.2测试): If you don't have Registry access on the server ,但拥有该服务器的应用程序发布权限,请创建一个带有简单控制器的MVC 5应用程序,如下所示:
然后在Web.config中,在下一节中介绍所需的.NET Framework版本,根据需要更改
targetFramework
值:将每个目标发布到您的服务器,然后浏览到
<app deploy URL>/Default
. 如果您的服务器支持目标框架,那么简单的字符串将显示在您的普通控制器中 . 如果没有,您将收到如下错误:所以在这种情况下,我的目标服务器还不支持.NET Framework 4.5.2 .
奇怪的是,当1.1出现时,我写了一些代码来实现这一点(七年前是什么?)并在2.0出现时稍微调整一下 . 多年来我没有看过它,因为我们不再管理我们的服务器 .
这不是万无一失的,但无论如何我都会张贴它,因为我发现它很幽默;因为它在.NET中更容易,而且在动力shell中更容易 .
找到版本可能是一种讨厌的方式,但我总是认为所有版本都已安装到
<root>:\WINDOWS\Microsoft.NET\Framework
.这提供了名称为
v2.0.50727
的文件夹,我相信它会提供详细的版本信息 .如果要查找.NET 4.5之前的版本,请使用控制台应用程序的代码 . 像这样:
否则,你可以通过这样查询找到.NET 4.5或更高版本:
然后,控制台结果将告诉您哪些版本已安装并可用于部署 . 此代码也派上用场,因为您可以将它们作为已保存的解决方案随时用于检查 .
另外,请参阅Stack Overflow问题How to detect what .NET Framework versions and service packs are installed?,其中还提到:
文章编号: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 ...为什么要官方微软答案是如此误导?您应该在要查找此信息的服务器上打开IE,然后转到此站点:http://www.hanselman.com/smallestdotnet/
这就是全部 .
该站点有一个脚本,可以查看您的浏览器的“UserAgent”并找出您安装(或没有)安装的.NET Framework的版本(如果有),并自动显示(如果您选择,则计算总大小)下载.NET Framework) .
我进入Windows Update并查看了更新历史记录,知道服务器修补程序是最新的 . 我向下扫描了.NET更新,它向我展示了哪些版本有更新,这让我得出结论哪些版本已安装 .
OneTouch部署将执行所有先决条件的检测和安装 . 最好是采用预先制定的解决方案,而不是试图自己动手 . 尝试自己滚动可能会导致问题,因为您键入的任何内容都可能随修补程序或Service Pack而更改 . 可能微软有一些启发式方法来确定正在运行的版本 .
我发现这个非常有用 . 这是source
根据CodeTrawler's answer,解决方案是在资源管理器窗口中输入以下内容:
然后搜索:
...并右键单击/转到每个结果的版本选项卡 .
微软的方式是这样的:
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文章中描述的检查 .
http://www.asoft.be/prod_netver.html
使用这个“好,轻,无需安装的程序”