У меня есть проект .NET, который всегда создавался / запускался на / на 32-битных машинах. Я получил новый 64-битный компьютер, и я пытаюсь справиться с задачей заставить его работать там. Скрипт сборки находится в nant, и в какой-то момент мы скомпилировали некоторый код boo, используя задачу nant. Код boo ссылается на нашу базовую DLL, которая была собрана из исходного кода c # ранее в процессе сборки.
Я пробовал две вещи: собрать его для работы в 32-битном режиме и собрать для работы в 64-битном режиме. Используя corflags в нескольких программах (включая booc), я смог построить проект, построенный в 32-битном режиме, но в ходе выполнения у меня возникли проблемы с нисходящим потоком. Поэтому мне нужно, чтобы он был встроен в 64-битный режим, который я считаю предпочтительным в любом случае.
Согласно исходному коду nant / booc, задача booc nant вызывает внутрипроцессный booc.exe с использованием класса Process CLR, поэтому (я думаю) она должна наследовать 32-битную или 64-битную от родительского процесса. Это не отражает то, что я вижу.
Вот что я сделал:
- Использовал 64-битную версию powershell для вызова nant
- Указанная платформа = "x64" в моих задачах. Я чувствую, что не должен был этого делать, потому что с anycpu все должно быть в порядке, но, похоже, это что-то меняет.
Вот ошибка, которую я получаю:
[booc] Compiling 5 files to 'C:\dev\build\MyProjectBoo.dll'.
[booc] BCE0106: Failed to access the types defined in assembly 'MyProject, Version=5.5.0.0, Culture=neutral, PublicKeyToken=null' - (C:\dev\build\MyProject.dll):Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
[booc] is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
[booc] is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
[booc] .
[booc] 1 error(s).
Что означает, согласно исходному коду Booc, «я попытался рефлексивно перечислить типы в вашей сборке, на которую ссылаются, но не смог». Я не знаю, означает ли это: «Я думаю, что я 32-битный, но это 64-битные DLL» или что-то еще, и я очень запутался.
Любые идеи о том, как я могу заставить это работать?
Обновление после некоторой работы я обнаружил, что проблема не имеет ничего общего с boo. Я написал быструю программу на C #, которая рефлексивно загружает dll, и она ломается таким же образом. Поэтому по какой-то причине, независимо от того, что я установил в качестве платформы (x86, x64 или anycpu), я не могу отражательно загрузить ее на машину x64. Так что на самом деле не виноват Бу. Так что я собираюсь покопаться в этом и сделать репост, если у меня есть вопрос получше.
Новое обновление
Оказывается, что одна из сторонних зависимостей моей основной DLL настаивает на том, чтобы находиться в 32-битной среде, даже если она не построена с corflags. Это вызывает сборку. Ошибка GetTypes () в 64-битном режиме.