我想从.NET代码中找出机器是否支持DirectX 10,最好不使用托管DirectX或XNA程序集。
提前谢谢!
答案 0 :(得分:1)
要检查DirectX10,我们实际上是通过平台调用来调用D3DX10CheckVersion function。
这需要在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;
}
答案 1 :(得分:1)
实际上非常简单:如果您使用的是Windows Vista / Server 2008或更高版本,则需要使用" DirectX 10" API。如果您使用的是Windows Vista / Server 2008 Service Pack 1或更高版本,则可以使用" DirectX 10.1" API。
这些都没有回答更有用的问题:系统是否有兼容DirectX 10的视频设备和驱动程序?
真正唯一确定的方法是创建设备。如果您可以(a)找到D3D10.DLL
和(b)对D3D10CreateDevice
的调用成功,那么您同时拥有DirectX 10 API和10兼容设备。
同样,如果您可以(a)找到D3D10_1.DLL
和(b)对D3D10CreateDevice1
的调用成功,那么您同时拥有DirectX 10.1 API和10.0或10.1兼容设备。
DirectX 11.0或更高版本始终存在于Windows 7 / Server 2008 R2或更高版本中。同样,如果您可以(a)找到D3D11.DLL
和(b)对D3D11CreateDevice
的调用成功,那么您同时拥有DirectX 11 API和某些feature level的11兼容设备。 create device的参数将决定允许的功能级别。此过程还可用于检测您在应用了KB97644更新的Windows Vista / Server 2008 Service Pack 2系统上的情况。
获得ID3D11Device
后,ID3D11Device1
可以使用QueryInterface来查看系统是否具有DirectX 11.1(Windows 8 / Server 2012或带有KB2670838的Windows 7 / Server 2008 R2,或者ID3D1Device2
查看系统是否具有DirectX 11.2(Windows 8.1 / Server 2012 R2)
请参阅Direct3D 11 Deployment for Game Developers
&#34的概念;安装了什么版本的DirectX"是过时的,可以追溯到Windows 9x / ME的时代。运行" DirectX最终用户运行时Redist"做了一些事情,但它从不安装新版本的DirectX。见Not So DirectSetup。 DirectX运行时纯粹是OS补丁级别的功能,自2004年以来一直存在。另见What's in a version number?。
答案 2 :(得分:0)
您可以使用此密钥配置单元查看计算机上安装的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互操作。
只是一个注释,我现在无法在我的机器上测试该代码,但这应该让你开始:)