Я хотел бы узнать из кода .NET, поддерживается ли DirectX 10 на машине, желательно без использования управляемых сборок DirectX или XNA.
Заранее спасибо!
Я хотел бы узнать из кода .NET, поддерживается ли DirectX 10 на машине, желательно без использования управляемых сборок DirectX или XNA.
Заранее спасибо!
На самом деле это очень просто: если вы используете 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 года. См. Что в номер версии? также.
Чтобы проверить 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;
}
Вы можете посмотреть версию 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.
Просто примечание: я не могу проверить этот код на своей машине прямо сейчас, но это должно помочь вам начать :)