// Package dotnet 读取本机 .NET Framework 安装信息(Windows 注册表)。 package dotnet import "golang.org/x/sys/windows/registry" const ( V45MinValue = 378389 V451MinValue = 378675 V452MinValue = 379893 V46MinValue = 393295 V461MinValue = 394254 V462MinValue = 394802 V47MinValue = 460798 V471MinValue = 461308 V472MinValue = 461808 V48MinValue = 528040 V481MinValue = 533320 ) // V2Info .NET Framework 2.0 安装信息 type V2Info struct { Install uint64 Version string } // V3Info .NET Framework 3.0 安装信息 type V3Info struct { Install uint64 Version string } // V35Info .NET Framework 3.5 安装信息 type V35Info struct { Install uint64 InstallPath string Version string } // V4Info .NET Framework 4.x 安装信息 type V4Info struct { Install uint64 InstallPath string Release uint64 Version string } // GetV2Info 获取 .NET Framework 2.0 安装信息 func GetV2Info() (V2Info, error) { key, err := registry.OpenKey(registry.LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727", registry.READ) info := V2Info{} if err != nil { return info, err } install, _, err := key.GetIntegerValue("Install") if err != nil { return info, err } version, _, err := key.GetStringValue("Version") if err != nil { return info, err } info.Install = install info.Version = version return info, nil } // GetV3Info 获取 .NET Framework 3.0 安装信息 func GetV3Info() (V3Info, error) { key, err := registry.OpenKey(registry.LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.0\\Setup", registry.READ) info := V3Info{} if err != nil { return info, err } install, _, err := key.GetIntegerValue("InstallSuccess") if err != nil { return info, err } version, _, err := key.GetStringValue("Version") if err != nil { return info, err } info.Install = install info.Version = version return info, nil } // GetV35Info 获取 .NET Framework 3.5 安装信息 func GetV35Info() (V35Info, error) { key, err := registry.OpenKey(registry.LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5", registry.READ) info := V35Info{} if err != nil { return info, err } install, _, err := key.GetIntegerValue("Install") if err != nil { return info, err } installPath, _, err := key.GetStringValue("InstallPath") if err != nil { return info, err } version, _, err := key.GetStringValue("Version") if err != nil { return info, err } info.Install = install info.InstallPath = installPath info.Version = version return info, nil } // GetV4Info 获取 .NET Framework 4.x 安装信息 func GetV4Info() (V4Info, error) { key, err := registry.OpenKey(registry.LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full", registry.READ) info := V4Info{} if err != nil { return info, err } install, _, err := key.GetIntegerValue("Install") if err != nil { return info, err } installPath, _, err := key.GetStringValue("InstallPath") if err != nil { return info, err } release, _, err := key.GetIntegerValue("Release") if err != nil { return info, err } version, _, err := key.GetStringValue("Version") if err != nil { return info, err } info.Install = install info.InstallPath = installPath info.Release = release info.Version = version return info, nil } // CheckFor45PlusVersion 根据 Release 注册表值判断 .NET Framework 4.5+ 的具体版本 func CheckFor45PlusVersion(releaseKey int) string { if releaseKey >= 533320 { return "4.8.1 or later" } if releaseKey >= 528040 { return "4.8" } if releaseKey >= 461808 { return "4.7.2" } if releaseKey >= 461308 { return "4.7.1" } if releaseKey >= 460798 { return "4.7" } if releaseKey >= 394802 { return "4.6.2" } 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 should mean // 安装4.5或更高版本。 return "No 4.5 or later version detected" }