如何在运行时检测XNA版本?

3

我有一个用.NET 2.0编写的启动器/更新程序,需要检查用户是否安装了XNA 4.0。

如果没有安装,就会要求用户安装它。

如何实现呢?


我建议您使用其他语言进行安装(例如C++)。您要安装的计算机上可能没有安装C#运行时,就像没有安装XNA运行时一样。也许可以尝试使用带有脚本的免费安装程序? - Jess
两个需要考虑的事情:http://forums.create.msdn.com/forums/p/562/2828.aspx#2828 可以考虑使用InnoInstaller脚本。另外,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\v4.0可能是您要查找的注册表键。 - Jess
1
安装程序是使用NSIS编写的。然而,更新程序会在用户运行启动器时从服务器下载更新的文件。最新的更新是从XNA 3.1升级到XNA 4.0,我需要告知我的用户有关更改的要求。.NET 2.0已预安装自Vista(大约有2/3的Windows机器都是Vista或更高版本)。XNA 4.0未预安装在任何Windows版本上。 - Habba
看一下我在答案中发布的注册表键,那应该就可以了。只有安装了才会存在这些名称(以及其他名称,如v3.0、v2.0)。 - Jess
2
可能是[启动前检查.NET依赖项]的重复问题(https://dev59.com/yUvSa4cB1Zd3GeqPg8BG)。 - Jeffrey Hantin
请注意,XNA 4.0需要.NET 4.0(而较早版本的XNA则针对较旧的.NET 2.0运行时)。 - Andrew Russell
2个回答

1
这里是我编写的一个函数,用于执行这个操作:

    public string CheckXNAFramework(out bool ok)
    {
        string output = "";

        string baseKeyName = @"SOFTWARE\Microsoft\XNA\Game Studio";
        Microsoft.Win32.RegistryKey installedFrameworkVersions = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(baseKeyName);

        string[] versionNames = installedFrameworkVersions.GetSubKeyNames();

        bool found = false;
        foreach (string s in versionNames)
        {
            if (s == "v4.0")
            {
                found = true;
                break;
            }
        }
        if (found)
        {
            output += "Microsoft XNA Framework found successfully.\n";
            ok = true;
        }
        else
        {
            output += "Correct version of the Microsoft XNA Framework not found. Please install version 4.0 or higher.\n";
            ok = false;
        }

        return output;
    }

这在Windows 8上与XNA 4.0 Refresh无法正常工作(但我预计它在任何安装了该版本XNA的Windows上都无法正常工作)。 - Matyas

0

好的,我认为查找是否安装了xna 4.0版本最简单的方法是查找注册表键。请参考this bytes forum中的示例。

此外,正如我的评论所述,这并不是最佳解决方案,因为C#运行时并不是非常普及,这意味着您的安装程序可能甚至无法工作。尝试使用oneclick安装程序或类似的软件(如InnoInstaller)。

编辑:感觉有点傻,这是要查找的注册表键:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\v4.0


3
请检查原始帖子上的评论。评论中提供了一个很好的理由,他们不必担心C#依赖性,但必须担心XNA依赖性。此外,我认为你描述的注册表键与XNA没有任何关系。 - Merlyn Morgan-Graham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接