映射驱动器上的构建失败,但不是本地

时间:2013-12-04 08:39:32

标签: c# msbuild xna monogame mapped-drive

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

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

这是我得到的构建错误:

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

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

我试过了:

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

为什么在运行映射的 S:\ 时构建失败,并且当源代码的副本放在我的 C:\ 上时成功?< /强>

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

1 个答案:

答案 0 :(得分:0)

这是我用过的黑客。这不是一个令人满意的答案(我不会将其标记为已被接受),但如果没有更好的解决方案,它将为我节省大量的时间和痛苦。

我编辑了我的2010项目文件,并将输出路径更改为:

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

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