1

我正在开发一个使用 VS2013 和 monogame 用 C# 编写的游戏。但是,monogame 不支持 XNA 内容管道(仍然),因此建议使用 Microsoft 的 XNA 和 VS2010 分别构建您的内容。由于我不想让我的主要开发机器 (Win8) 与 VS2010 等杂乱无章,因此我创建了一个 Win7 虚拟机来运行 Win7 以及 VS2010 以及构建内容所需的所有工具。我所有的项目和解决方案文件都有对应的 2010 版本,而 2010 解决方案只有构建内容所需的项目。

我可以成功构建内容,但前提是它直接存在于 VM 的硬盘 ( C:\ ) 上。如果我将本地驱动器映射到主机上的网络共享并尝试构建,则会收到构建时错误。我为什么要这样做?因为我想要一个源代码树的副本,所以我可以以不错的速度进行迭代。如果我在虚拟机中有一个单独的源代码树,那就太痛苦了,而且容易出错。

这是我得到的构建错误:

Error loading pipeline assembly "S:\Src\ContentPipelineExtension\bin\x86\Debug\Newtonsoft.Json.dll".

我有S:\映射到我的网络共享。Newtonsoft.Json.dll存在于指定的路径中。

我努力了:

  • 指定/verbosity:d何时构建以查看是否输出更多信息。没有。
  • 将调试器附加到MSBuild.exe进程并启用任何异常中断。它永远不会破裂。
  • 使用subst而不是 Windows Explorer 的驱动器映射工具(它可能subst在幕后使用,但我想确定一下)。
  • 调试 MSBuild,但我这样做时遇到了“不匹配的休假”错误
  • 为不匹配的离开错误应用了解决方法,并同时在C:\S:\上调试了构建。BuildContent在这两种情况下,我都在调用 XNA 的任务之前放置了一个断点。我让两个构建运行,直到它们达到这个断点,然后我并排打开本地窗口。我比较了所有本地人,发现除了预期的C:\S:\路径根之外没有区别。
  • 深入研究 ILSpy 中的 XNA 代码,试图找出问题所在,但也没有运气
  • 通过执行以下命令启用对 CAS 中网络共享的完全信任CasPol.exe -m -ag 1.2 -url file://S:\* FullTrust:行为没有变化。
  • 启用 Fusion Log Viewer ( fuslogvw.exe) 并检查其日志。它说它已成功加载程序集!
  • 添加<loadFromRemoteSources enabled="true"/>到我的MSBuild.exe.config。没变。

为什么在运行映射的S:\时构建失败,而当将源的副本放在我的C:\上时构建成功?

更新:我刚刚发现了最糟糕的解决方法。我修改了我的ContentPipelineExtension项目Output Path,使其成为我C:\上的绝对目录。这允许构建成功完成,但显然远非理想。

4

1 回答 1

0

这是我使用的一个技巧。这不是一个令人满意的答案(我不会将其标记为已接受),但在没有更好的解决方案的情况下,它将为我节省大量时间和痛苦。

我编辑了 2010 年的项目文件并将输出路径更改为如下内容:

<OutputPath>$(TEMP)\ContentPipelineExtension\bin\x86\Debug\</OutputPath>

TEMP环境变量解析为C:\上的文件夹,并为我节省了对特定路径的硬编码。现在我可以使用我在我的主要 Win8 机器中使用的相同源代码树从我的 Win7 VM 构建项目。

于 2013-12-06T07:43:36.333 回答