2010-04-20 6 views
4

Je voudrais savoir à partir du code .NET si DirectX 10 est pris en charge sur la machine, de préférence sans utiliser d'assemblages DirectX ou XNA gérés..NET Comment détecter si DirectX 10 est supporté?

Merci d'avance!

+0

duplication possible de [Vérifier quelle version de DirectX est installée] (http://stackoverflow.com/questions/17130764/check-which-version-of-directx-is-installed) –

Répondre

0

Vous pouvez jeter un oeil à la version de DirectX installée sur votre ordinateur en utilisant cette ruche clé

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectX 

Voici un exemple

[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; 
      } 
        } 
    } 
} 

Maintenant, si vous voulez savoir si votre carte vidéo prend en charge DirectX , cela va nécessiter XNA ou DirectX interop.

Juste une remarque, je ne pouvais pas tester ce code sur ma machine en ce moment, mais cela devrait vous aider à démarrer :)

+0

Whhooops mauvaise vérification de version colde! Vérifiez la version # ici: http://en.wikipedia.org/wiki/DirectX#Releases –

+0

Cela ne semble pas fonctionner. Je suis sur Windows 7 mais il s'agit de la version 9. DirectX 10 et 11 doivent utiliser une zone différente du registre. – DuckMaestro

+0

Cela pourrait être correct) ne supportant pas DX10) à moins que le DirectX Runtime est installé https://www.microsoft.com/en-gb/download/details.aspx?id=8109 –

1

Pour vérifier DirectX10, nous appelons en fait le D3DX10CheckVersion function via la plate-forme Invoke.

Cela nécessite la présence des DLL D3DX10 dans les dossiers C: \ Windows \ System32 ou C: \ Windows \ SysWow64 (dépendant de la plateforme). Si ce n'est pas le cas, vous devez installer le DirectX10 Runtime sur le PC cible.

La version actuelle du support DirectX version/SDK DirectX peut être déterminée à partir des paramètres de l'appel P/Invoke.

Voici le P/Invoke appel:

// 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; 
} 
+0

Nice, semble également que cela fonctionne pour DirectX 11 avec des modifications mineures. –

+0

Veuillez noter que vous devrez vérifier la présence de D3DX10_43.dll sur la machine cible avant d'appeler cette fonction P/Invoke. Il se trouve généralement dans C: \ Windows \ System ou System32 selon la version de la plate-forme. –

+0

Merci. Je suppose que l'appel de cela emballé dans essayer attraper ferait l'affaire non? –

0

Il est en fait très simple: Si vous êtes sous Windows Vista/Server 2008 ou plus tard, vous avez "DirectX 10" l'API. Si vous utilisez Windows Vista/Server 2008 Service Pack 1 ou version ultérieure, vous avez "DirectX 10.1" l'API.

Aucune de ces réponses à la question plus utile de: le système dispose-t-il d'un périphérique vidéo compatible avec DirectX 10 et d'un pilote? Vraiment le seul moyen sûr de détecter cela est de créer l'appareil. Si vous pouvez (a) trouver le D3D10.DLL et (b) un appel à D3D10CreateDevice réussit, alors vous avez à la fois l'API DirectX 10 et un périphérique compatible 10. De même, si vous pouvez (a) trouver le D3D10_1.DLL et (b) un appel à D3D10CreateDevice1 réussit, alors vous avez à la fois l'API DirectX 10.1 et un périphérique compatible 10.0 ou 10.1.

DirectX 11.0 ou version ultérieure est toujours présent sur Windows 7/Server 2008 R2 ou version ultérieure. Encore une fois, si vous pouvez (a) trouver le D3D11.DLL et (b) un appel à D3D11CreateDevice réussit, alors vous avez à la fois l'API DirectX 11 et un périphérique compatible 11 de certains feature level. Les paramètres du create device déterminent les niveaux de fonctionnalité autorisés. Cette procédure permet également de détecter le cas où vous vous trouvez sur un système Windows Vista/Server 2008 Service Pack 2 avec la mise à jour KB97644 appliquée.

Une fois que vous avez un ID3D11Device vous pouvez QueryInterface pour ID3D11Device1 pour voir si le système a DirectX 11.1 (Windows 8/Server 2012 ou Windows 7/Server 2008 R2 avec KB2670838 ou ID3D1Device2 pour voir si le système a DirectX 11.2 (Windows 8.1/Server 2012 R2)

Voir Direct3D 11 Deployment for Game Developers

Le concept de "Quelle version de DirectX est installée" est vétuste et remonte à l'époque de Windows 9x/ME. Exécuter le "DirectX End-User Runtime Redist" fait certaines choses, mais jamais installe une nouvelle version de DirectX. Voir Not So DirectSetup. Le runtime DirectX est purement une fonction du niveau de patch du système d'exploitation et a été depuis ~ 2004. Voir aussi What's in a version number?.

Questions connexes