.NET Как определить, поддерживается ли DirectX 10? - PullRequest
4 голосов
/ 20 апреля 2010

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

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

Ответы [ 3 ]

1 голос
/ 12 февраля 2015

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

Для этого требуется наличие DLL-файлов D3DX10 в папках C: \ Windows \ System32 или C: \ Windows \ SysWow64 (зависит от платформы). Если их нет, вам нужно установить 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 голос
/ 20 февраля 2015

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

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

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

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

DirectX 11.0 или более поздняя версия всегда присутствует в Windows 7 / Server 2008 R2 или более поздней версии. Опять же, если вы можете (а) найти D3D11.DLL и (б) вызов на D3D11CreateDevice, то у вас есть и DirectX 11 API, и 11-совместимое устройство с некоторым уровнем возможностей . Параметры устройства create будут определять, какие уровни функций разрешены. Эта процедура также работает для обнаружения случая, когда вы работаете в системе 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» делает некоторые вещи, но он никогда не устанавливает новую версию DirectX. См. Not So DirectSetup . Среда выполнения DirectX является чисто функцией уровня исправлений ОС и существует с ~ 2004 года. См. Что входит в номер версии? .

0 голосов
/ 20 апреля 2010

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

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

...