我一直在尝试使用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存在一个小问题,要么我没有提供任何东西,要么实际上设置错误。

有帮助吗?

解决方案

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

解决方案可能是看看Team City是否能够请求它的构建器以登录用户身份运行,而不是作为本地系统或服务运行,但我无法告诉您实际上甚至可能在Team City。

其他提示

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

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

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

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

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

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

希望这有所帮助。

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

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

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

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

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

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

&安培;

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

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

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

但看起来它只会在Vista或更高版本上运行 - 希望它也应该包含服务器。更新:不幸的是,它不会安装在我的Windows服务器上:(

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top