Сбой сборки на подключенном диске, но не локально

Я работаю над игрой, написанной на C#, используя VS2013 и моногаму. Тем не менее, monogame не поддерживает конвейер контента XNA (все еще), поэтому советуем вам создавать контент отдельно, используя Microsoft XNA и VS2010. Поскольку я не хотел загромождать свою основную машину разработки (Win8) с VS2010 и так далее, я создал виртуальную машину Win7 для запуска Win7 вместе с VS2010 и всеми инструментами, необходимыми для создания своего контента. Все мои файлы проектов и решений имеют соответствующие версии 2010 года, а решение 2010 года имеет только проекты, необходимые для создания контента.

Я могу успешно создать контент, но только если он находится прямо на жестком диске виртуальной машины (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:\. В обоих случаях я ставлю точку останова прямо перед XNA BuildContent задача была названа. Я позволил обеим сборкам работать до тех пор, пока они не дойдут до этой точки останова, а затем открыл окна локальных компьютеров, бок о бок. Я сравнил все местные жители и не нашел никакой разницы, кроме ожидаемых корней C:\ против S:\ path.
  • проверил код XNA в ILSpy, чтобы попытаться выяснить, в чем дело, но тоже не повезло
  • включение полного доверия на сетевом ресурсе в 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:\. Это позволяет завершить сборку успешно, но, очевидно, далеко от идеала.

1 ответ

Вот хак, который я использовал. Это не удовлетворительный ответ (и я не буду отмечать его как принятый), но в отсутствие лучшего решения он сэкономит мне огромное количество времени и боли.

Я отредактировал мои файлы проекта 2010 года и изменил пути вывода на что-то вроде этого:

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

TEMP Переменная окружения преобразуется в папку на C:\ и избавляет меня от необходимости жестко задавать конкретный путь. Теперь я могу собрать проект из моей виртуальной машины Win7, используя то же дерево исходных текстов, которое я использую на своей основной машине с Win8.

Другие вопросы по тегам