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