.NET如何检测是否支持DirectX 10?

时间:2010-04-20 09:28:06

标签: .net directx-10

我想从.NET代码中找出机器是否支持DirectX 10,最好不使用托管DirectX或XNA程序集。

提前谢谢!

3 个答案:

答案 0 :(得分:1)

要检查DirectX10,我们实际上是通过平台调用来调用D3DX10CheckVersion function

这需要在C:\ Windows \ System32或C:\ Windows \ SysWow64文件夹中存在D3DX10 DLL(取决于平台)。如果这些不存在,则需要在目标PC上安装DirectX10 Runtime

实际支持DirectX版本/ DirectX SDK版本可以从P / Invoke调用的参数中确定。

这是P / Invoke电话:

// DX10 Supported Function
// See D3DX10CheckVersion http://msdn.microsoft.com/en-us/library/windows/desktop/bb172639(v=vs.85).aspx
[DllImport("d3dx10_43.dll", EntryPoint = "D3DX10CheckVersion", CallingConvention = CallingConvention.StdCall, SetLastError = false)]
private static extern HResult D3DX10CheckVersion(
        uint D3DSdkVersion,
        uint D3DX10SdkVersion);

public enum HResult : int
{
    S_OK = 0x0000,
    S_FALSE = 0x0001,
    E_NOTIMPL = 0x0002,
    E_INVALIDARG = 0x0003,
    E_FAIL = 0x0004,
};

bool SupportsDirectX10()
{
    // Values taken from d3d10.h to check DirectX version
    const uint D3D10_SDK_VERSION = 29;
    const uint D3DX10_SDK_VERSION = 43;

    // Checks DirectX 10 GPU compatibility with the DirectX10 runtime
    // Assumes D3DX10 DLLs present in C:\Windows\System32 or
    // C:\Windows\SysWow64 folders (platform dependent)
    HResult hResult = D3DX10CheckVersion(D3D10_SDK_VERSION, D3DX10_SDK_VERSION);
    return hResult == HResult.S_OK; 
}

答案 1 :(得分:1)

实际上非常简单:如果您使用的是Windows Vista / Server 2008或更高版本,则需要使用" DirectX 10" API。如果您使用的是Windows Vista / Server 2008 Service Pack 1或更高版本,则可以使用" DirectX 10.1" API。

这些都没有回答更有用的问题:系统是否有兼容DirectX 10的视频设备和驱动程序?

真正唯一确定的方法是创建设备。如果您可以(a)找到D3D10.DLL和(b)对D3D10CreateDevice的调用成功,那么您同时拥有DirectX 10 API和10兼容设备。

同样,如果您可以(a)找到D3D10_1.DLL和(b)对D3D10CreateDevice1的调用成功,那么您同时拥有DirectX 10.1 API和10.0或10.1兼容设备。

DirectX 11.0或更高版本始终存在于Windows 7 / Server 2008 R2或更高版本中。同样,如果您可以(a)找到D3D11.DLL和(b)对D3D11CreateDevice的调用成功,那么您同时拥有DirectX 11 API和某些feature level的11兼容设备。 create device的参数将决定允许的功能级别。此过程还可用于检测您在应用了KB97644更新的Windows Vista / Server 2008 Service Pack 2系统上的情况。

获得ID3D11Device后,ID3D11Device1可以使用QueryInterface来查看系统是否具有DirectX 11.1(Windows 8 / Server 2012或带有KB2670838的Windows 7 / Server 2008 R2,或者ID3D1Device2查看系统是否具有DirectX 11.2(Windows 8.1 / Server 2012 R2)

请参阅Direct3D 11 Deployment for Game Developers

&#34的概念;安装了什么版本的DirectX"是过时的,可以追溯到Windows 9x / ME的时代。运行" DirectX最终用户运行时Redist"做了一些事情,但它从不安装新版本的DirectX。见Not So DirectSetup。 DirectX运行时纯粹是OS补丁级别的功能,自2004年以来一直存在。另见What's in a version number?

答案 2 :(得分:0)

您可以使用此密钥配置单元查看计算机上安装的DirectX版本

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectX

这是一个示例

[assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum,All = "HKEY_LOCAL_MACHINE")]
class Test
{
    public int DxLevel
    {
        get
        {
            using(RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\DirectX"))
            {
                string versionStr = key.GetValue("Version") as string;

                if (!string.IsNullOrEmpty(versionStr))
                {
                    var versionComponents = versionStr.Split('.');
                    if (versionComponents.Length > 1)
                    {
                        int directXLevel;
                        if (int.TryParse(versionComponents[1], out directXLevel))
                            return directXLevel;
                    }
                }
                return -1;
            } 
                     }
    }
}

现在,如果您想知道您的视频卡是否支持DirectX,则需要XNA或DirectX互操作。

只是一个注释,我现在无法在我的机器上测试该代码,但这应该让你开始:)