我正在开发一个使用 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:\上的绝对目录。这允许构建成功完成,但显然远非理想。