Сбой сборки на подключенном диске, но не локально
Я работаю над игрой, написанной на 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.