5

我一直在尝试使用 TeamCity 4.5 来自动构建 XNA 项目,但我遇到了一个小问题。我的项目在 Visual Studio 2008 下正确编译,但在使用 TeamCity 作为构建器编译时无法正确编译。配置文件使用 sln2008 设置,并且编译了一段时间,但是一旦将 .png 纹理编译为 .xnb,我就会收到以下错误:

[11:28:41]: [Project "Content.contentproj" (default targets):] Content\head.png Building content threw InvalidOperationException: D3DERR_INVALIDCALL
at Microsoft.Xna.Framework.Content.Pipeline.CommonHelperFunctions.InitD3D()
at Microsoft.Xna.Framework.Content.Pipeline.TextureImporter.InitD3D()
at Microsoft.Xna.Framework.Content.Pipeline.TextureImporter.Import(String filename, ContentImporterContext context)
at Microsoft.Xna.Framework.Content.Pipeline.ContentImporter`1.Microsoft.Xna.Framework.Content.Pipeline.IContentImporter.Import(String filename, ContentImporterContext context)
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.ImportAssetDirectly(BuildItem item, String importerName)
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.ImportAsset(BuildItem item)
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.BuildAssetWorker(BuildItem item)
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.BuildAsset(BuildItem item)
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.RunTheBuild()
at Microsoft.Xna.Framework.Content.Pipeline.Tasks.BuildContent.RemoteProxy.RunTheBuild(BuildCoordinatorSettings settings, TimestampCache timestampCache, ITaskItem[] sourceAssets, String[]& outputContent, String[]& rebuiltContent, String[]& intermediates, Dictionary`2& dependencyTimestamps, KeyValuePair`2[]& warnings)
Inner exception: COMException: Exception from HRESULT: 0x8876086C

我不知道是什么原因造成的。就像我说的,它能够正确编译 .fbx 模型以及我的 ContentPipeline 项目和 SharedContent 项目(解决方案的一部分)。

我真正想要的是一些指向问题根源的指针(如果可能的话,是问题的解决方案)。据我了解,D3D 库似乎存在问题。我还要提醒您,整个解决方案是在 Visual Studio 2008 下编译的,因此 TeamCity 存在一个小问题,要么我没有提供任何东西,要么实际上设置不正确。

4

4 回答 4

2

我没有解决方案,但我一直在考虑。

错误是 D3DERR_INVALIDCALL 所以我认为由于某种原因该设备当时不可用。

1) 运行构建的机器是否安装了 DirectX/显卡?我假设是的,因为 XNA 需要带有着色器的卡,但 TeamCity 是一个构建发行版,所以它可能在没有它的机器上运行?

2) 也许 TeamCity 导致在同一台机器/进程上创建太多 Direct3D 设备(完全猜测)?

正确编译的模型文件是使用纹理还是只是几何数据?我有一种感觉,内容构建器不需要访问 DirectX 来构建模型,但需要访问纹理数据。你能构建其他需要访问 Direct3D 的东西吗?您可以使用 TeamCity 构建一个在其内容文件夹中只有一个纹理的项目吗?

我不确定这是否可行,但您能否通过在调试模式下运行 DirectX 并查看输出来获得更多信息?

希望这会有所帮助。

于 2009-06-24T12:15:08.837 回答
2

几乎可以肯定的是,Team City 正在以非交互模式作为本地系统运行其构建过程,而不是作为实际有权访问和获取图形设备的用户。我知道我什至尝试通过远程桌面界面批处理纹理时遇到了问题,因为 DirectX 无法抓取图形设备。

解决方案可能是查看 Team City 是否让您能够请求它的构建器作为登录用户运行,而不是作为本地系统或作为服务运行,尽管我不能告诉你这在 Team City 中实际上是可能的.

于 2009-06-25T20:53:47.530 回答
2

XNA 和 DirectX 9 需要当前登录用户才能编译 Content 文件夹。

解决方法很简单,用XNA(VS2008,XNA Game Studio 3.0等)的pre-reqs设置一个构建代理机器(真实物理机器)并让它在启动时登录,然后创建一个脚本来运行团队服务器登录时的代理(通过在开始菜单的启动文件夹中放置代理运行脚本的快捷方式)。

这样,代理将以本地用户身份运行,并且可以正常构建。

我已经这样做了,并且可以确认它有效。

于 2009-07-13T06:32:40.337 回答
2

很抱歉拖了一个旧线程,但我刚刚遇到了完全相同的问题,试图让 TC 在 Windows Server 上构建我的 XNA 项目,并希望帮助其他遇到同样问题的人。

我刚刚发现这篇文章和博客看起来像是一个非常有前途的解决方案: http ://forums.create.msdn.com/forums/p/86699/532976.aspx

&

http://blogs.msdn.com/b/astebner/archive/2011/07/07/10184338.aspx

Aaron 基本上说 Win Phone SDK 7.1 Beta 2 的新 beta 包含 XNA Game Studio 4.0 Refresh Beta 2,它现在允许您通过以下类型的配置通过内容管道构建内容:

如果您的屏幕在构建期间被锁定 如果您在无头计算机上运行构建 如果您从非交互式用户帐户运行构建

但看起来它只能在 Vista 或更高版本上运行——希望这也应该包括服务器。更新:不,遗憾的是它不会安装在我的 Windows Server 上 :(

于 2011-08-07T11:49:01.683 回答