【问题标题】:D3DERR_NOTAVAILABLE in unit test on Teamcity Build ServerTeamcity Build Server 上的单元测试中的 D3DERR_NOTAVAILABLE
【发布时间】:2016-10-04 18:16:21
【问题描述】:

为了测试使用 DirectX 的可视化 WPF 控件库,我创建了一些单元测试来创建 DirectX 场景、屏幕截图,然后与预期图像进行比较。

我知道这是一种脆弱的单元测试技术(视觉比较),但它可以帮助我们涵盖大量可能的组合。

我遇到的问题是测试在本地运行得很好,但在构建服务器上失败并出现错误:

SharpDX.SharpDXException : HRESULT: [0x8876086A], Module: 
[SharpDX.Direct3D9], ApiCode: [D3DERR_NOTAVAILABLE/NotAvailable], Message: Unknown
   at SharpDX.Result.CheckError()
   at SharpDX.Direct3D9.D3D9.Create9Ex(Int32 sDKVersion, Direct3DEx arg1)
   at SharpDX.Direct3D9.Direct3DEx..ctor()

但是,如果我登录到构建服务器并运行测试,它们就会通过! (见下文)

构建服务器是 Windows Server 2012 R2 并具有 DirectX10 Warp(软件)驱动程序。

我怀疑related to this issue here 团队城市构建代理的用户配置文件不允许获取 DirectX 设备。我已经更改了 Teamcity 服务,并且 TeamCity 构建代理以用户身份登录,但仍然没有运气。

有什么想法吗?

【问题讨论】:

  • 可能需要允许服务与桌面交互?
  • 是这样的。我不知道它是否a.) 可能和b.) 如果可能的话,如何配置它。
  • oo 我刚刚看到服务中的复选框 -> Teamcity Build Agent -> 登录为!我会试试的...
  • ...不,它仍然失败,同样的错误,但你给了我一些东西要搜索..
  • 不是 32/64 位的问题吗?我不确定组件注册是否受 WOW 重定向的影响。

标签: c# wpf unit-testing directx teamcity


【解决方案1】:

要在 Teamcity 代理上运行使用 DirectX 驱动程序的测试,您必须确保服务在用户帐户下运行(例如,不是代理服务默认使用的 SYSTEM 帐户)。此外,该帐户当前需要登录到代理计算机。在没有登录帐户的情况下,没有活动桌面(DirectX 初始化所必需的)。

从 cmets 看来,您似乎已经找到了如何更改服务运行的帐户(例如,在 How can I change the user identity that runs a build agent in TeamCity? 中描述)。要让服务运行的用户帐户始终登录,您可以考虑配置Windows Automatic Login。您也可以手动登录计算机,具体取决于您的设置。

作为附加提示,远程桌面有时会导致登录用户的桌面出现问题,从而导致 DirectX 初始化失败。如果您想远程查看代理,您可以改用 VNC(或等效),这不会导致此类问题。

【讨论】:

  • 这是一个很好的答案,但我已经尝试过了。我已将 Teamcity 构建代理和服务更改为以用户身份运行,启用“允许本地桌面交互”并重新启动服务器。然后,我在登录时(作为远程桌面)运行了 teamcity 作业。测试失败:/
  • 您无法使用远程桌面登录,因为 DirectX 应用程序无法在远程桌面会话中运行,它必须是本地登录。如果您没有对机器的物理访问权限,则应考虑我在回答中提到的自动登录(即本地登录)。
  • 这实际上部分是不真实的。正如我在问题中提到的,我可以登录到服务器,在本地(在 Visual Studio 内)运行测试并且它们通过了。因此,在构建服务器上运行的 Visual Studio 实例能够在通过远程桌面登录时获取 DirectX 设备。只是 teamcity 代理不能(即使它以用户身份登录,通过桌面交互):?
  • 似乎有些版本的 Windows 确实通过远程桌面支持 DirectX,但我从来没有成功地让它工作过。也许你的服务器和代理运行的版本不同,服务器一兼容,代理不兼容?
  • 不,远程桌面到服务器和构建代理在同一台物理机器上。这是一个奇怪的我会给你的!
猜你喜欢
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多