.NET Как определить, поддерживается ли DirectX 10?

Я хотел бы узнать из кода .NET, поддерживается ли DirectX 10 на машине, желательно без использования управляемых сборок DirectX или XNA.

Заранее спасибо!


person ShdNx    schedule 20.04.2010    source источник
comment
возможный дубликат Проверьте, какая версия DirectX установлена   -  person Peter O.    schedule 17.06.2013


Ответы (3)


На самом деле это очень просто: если вы используете Windows Vista/Server 2008 или более позднюю версию, у вас есть API DirectX 10. Если вы используете Windows Vista/Server 2008 с пакетом обновления 1 или более поздней версии, у вас есть API DirectX 10.1.

Ни один из них не отвечает на более полезный вопрос: есть ли в системе видеоустройство и драйвер, совместимые с DirectX 10?

На самом деле единственный надежный способ обнаружить это — создать устройство. Если вы можете (а) найти D3D10.DLL и (б) вызов D3D10CreateDevice завершился успешно, то у вас есть и DirectX 10 API, и 10-совместимое устройство.

Точно так же, если вы можете (а) найти D3D10_1.DLL и (б) вызов D3D10CreateDevice1 успешен, то у вас есть API DirectX 10.1 и устройство, совместимое с 10.0 или 10.1.

DirectX 11.0 или более поздняя версия всегда присутствует в Windows 7/Server 2008 R2 или более поздней версии. Опять же, если вы можете (а) найти D3D11.DLL и (б) вызов D3D11CreateDevice завершился успешно, то у вас есть как DirectX 11 API, так и 11-совместимое устройство какого-то уровень функций. Параметры для создать устройство определит, какие уровни функций разрешены. Эта процедура также поможет обнаружить случай, когда вы работаете в системе Windows Vista/Server 2008 с пакетом обновления 2 (SP2) с . Применено обновление KB97644.

Получив ID3D11Device, вы можете использовать QueryInterface для ID3D11Device1, чтобы узнать, есть ли в системе DirectX 11.1 (Windows 8/Server 2012 или Windows 7/Server 2008 R2 с KB2670838 или ID3D1Device2, чтобы узнать, есть ли в системе DirectX 11.2 (Windows 8.1 / Server 2012 R2)

См. раздел Развертывание Direct3D 11 для разработчиков игр.

Концепция «Какая версия DirectX установлена» устарела и восходит к эпохе Windows 9x/ME. Запуск "DirectX End-User Runtime Redist" делает некоторые вещи, но он никогда не устанавливает новую версию DirectX. См. раздел Не очень DirectSetup. Среда выполнения DirectX зависит исключительно от уровня исправления ОС и существует примерно с 2004 года. См. Что в номер версии? также.

person Chuck Walbourn    schedule 20.02.2015

Чтобы проверить DirectX10, мы на самом деле вызываем Функция D3DX10CheckVersion через вызов платформы.

Для этого требуется наличие библиотек DLL D3DX10 в папках C:\Windows\System32 или C:\Windows\SysWow64 (зависит от платформы). Если их нет, вам необходимо установить среду выполнения DirectX10 на целевом ПК.

Фактическую поддерживаемую версию 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; 
}
person Dr. Andrew Burnett-Thompson    schedule 12.02.2015
comment
Хорошо, также кажется, что он работает для DirectX 11 с небольшими изменениями. - person Waldo Alvarez; 02.01.2016
comment
Просто имейте в виду, что вам нужно будет проверить наличие D3DX10_43.dll на целевой машине перед вызовом этой функции P/Invoke. Обычно он находится в C:\Windows\System или System32 в зависимости от версии платформы. - person Dr. Andrew Burnett-Thompson; 02.01.2016
comment
Спасибо. Я полагаю, вызов этого, обернутого в try catch, поможет правильно? - person Waldo Alvarez; 04.01.2016
comment
Это сработает, но гораздо проще просто проверить наличие D3DX10_43.dll в System или System32. Также обратите внимание: отсутствие этих файлов не означает, что ваш компьютер не поддерживает DirectX10. D3DX10_43.dll является частью DirectX SDK за июнь 2010 г. и должен распространяться на ПК конечных пользователей. Взгляните на эту ссылку (support.scichart.com/index.php?/Knowledgebase/Article/View/), чтобы увидеть, как мы решаем эту проблему. - person Dr. Andrew Burnett-Thompson; 04.01.2016
comment
Другой способ решить эту проблему без D3DX10_43.dll — попытаться создать устройство с помощью вызова платформы и обернуть в Try/Catch msdn.microsoft.com/en-us/library/windows/desktop/ - person Dr. Andrew Burnett-Thompson; 04.01.2016
comment
Что я пытаюсь сделать, так это уведомить пользователя во время установки, если DirectX 11 (я разобрал dll, чтобы проверить значения) заранее можно использовать, чтобы он / она знал, будет ли игра работать или нет. Я хочу, чтобы он был крепким. Я имею в виду, что код не рухнет, даже если Directx полностью не существует. - person Waldo Alvarez; 04.01.2016

Вы можете посмотреть версию 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.

Просто примечание: я не могу проверить этот код на своей машине прямо сейчас, но это должно помочь вам начать :)

person Florian Doyon    schedule 20.04.2010
comment
Упс, неправильная проверка версии! Проверьте номер версии здесь: en.wikipedia.org/wiki/DirectX#Releases - person Florian Doyon; 20.04.2010
comment
Это не работает. У меня Windows 7, но сообщается о версии 9. DirectX 10 и 11 должны использовать другую область реестра. - person DuckMaestro; 28.05.2011
comment
Возможно, это правильно (не поддерживает DX10), если не установлена ​​среда выполнения DirectX microsoft.com/en-gb/download/details.aspx?id=8109 - person Dr. Andrew Burnett-Thompson; 12.02.2015
comment
Ключи реестра недокументированы и крайне ненадежны. - person Chuck Walbourn; 20.02.2015