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

4

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

谢谢您的帮助!


1
可能是检查安装的DirectX版本的重复问题。 - Peter O.
3个回答

2
实际上非常简单:如果您使用的是Windows Vista / Server 2008或更高版本,则拥有“DirectX10” API。如果您使用的是Windows Vista / Server 2008 Service Pack 1或更高版本,则拥有“DirectX10.1” API。
这两者都无法回答更有用的问题:系统是否具有DirectX10兼容的视频设备和驱动程序?
真正确定此项任务的唯一方法是创建设备。如果您可以(a)找到“D3D10.DLL”,并且(b)调用“D3D10CreateDevice”成功,则同时具有DirectX10 API和10兼容设备。
同样,如果您可以(a)找到“D3D10_1.DLL”,并且(b)调用“D3D10CreateDevice1”成功,则同时具有DirectX10.1 API和10.0或10.1兼容设备。
DirectX11.0或更高版本始终存在于Windows 7 / Server 2008 R2或更高版本中。同样,如果您可以(a)找到“D3D11.DLL”,并且(b)调用“D3D11CreateDevice”成功,则同时具有某些功能级别的DirectX11 API和11兼容设备。创建设备的参数将确定允许哪些功能级别。此过程也适用于检测您在应用了“KB97644”更新的Windows Vista / Server 2008 Service Pack 2系统的情况。
一旦您拥有“ID3D11Device”,就可以查询“ID3D11Device1”以查看系统是否具有DirectX11.1(Windows 8 / Server 2012或Windows 7 / Server 2008 R2,带有“KB2670838”)或“ID3D1Device2”以查看系统是否具有DirectX11.2(Windows 8.1 / Server 2012 R2)。
请参阅“游戏开发人员的Direct3D 11部署”。
“安装哪个版本的DirectX”这个概念已经过时了,它可以追溯到Windows 9x/ME时代。运行“DirectX End-User Runtime Redist”会执行一些操作,但它永远不会安装新版本的DirectX。请参见Not So DirectSetup。自2004年以来,DirectX运行时纯粹是操作系统补丁级别的功能。此外,请参见版本号里面有什么?

1
为了检查DirectX10,我们实际上通过平台调用来调用D3DX10CheckVersion函数
这需要在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; 
}

不错,看起来只需要进行一些小的修改就可以在DirectX 11上运行。 - Waldo Alvarez
请注意,在调用此P/Invoke函数之前,您需要检查目标计算机上是否存在D3DX10_43.dll。它通常位于C:\Windows\System或System32中,具体取决于平台版本。 - Dr. Andrew Burnett-Thompson
谢谢。我想把它包在try catch里面会起作用,对吧? - Waldo Alvarez
它可以工作,但最好只需检查系统或System32中是否存在D3DX10_43.dll即可。还要注意:没有这些文件并不意味着您的计算机不支持DirectX10。 D3DX10_43.dll是2010年6月DirectX SDK的一部分,必须重新分发到最终用户PC上。请参阅此链接(http://support.scichart.com/index.php?/Knowledgebase/Article/View/17262/0/creating-and-deploying-applications-with-the-direct3d10rendersurface),了解我们如何解决此问题。 - Dr. Andrew Burnett-Thompson
另一种不需要使用D3DX10_43.dll解决它的方法是尝试使用平台调用创建设备,并在Try/Catch中进行包装。https://msdn.microsoft.com/en-us/library/windows/desktop/ff476082%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 - Dr. Andrew Burnett-Thompson
我想做的是在安装过程中通知用户,如果DirectX 11(我已经反汇编了dll以检查值)可用,则他/她会知道游戏是否能够运行。我希望它是强大的。我的意思是,即使Directx完全不存在,代码也不会崩溃。 - Waldo Alvarez

-1
你可以使用此键值来查看计算机上安装的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互操作。

只是一个提示,我现在无法在我的机器上测试那段代码,但那应该可以让你开始 :)


哎呀,版本检查代码错了!在这里检查版本号:http://en.wikipedia.org/wiki/DirectX#Releases - Florian Doyon
这似乎不起作用。我使用的是Windows 7,但它报告版本9。DirectX 10和11必须使用注册表的不同区域。 - DuckMaestro
这可能是正确的(不支持DX10),除非安装了DirectX Runtime https://www.microsoft.com/en-gb/download/details.aspx?id=8109 - Dr. Andrew Burnett-Thompson
1
注册表键是未记录的且极不可靠的。 - Chuck Walbourn

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