У меня есть проект .NET, который всегда строится/запускается на 32-битных машинах. У меня появился новый 64-битный компьютер, и я пытаюсь решить задачу заставить его работать там. Сценарий сборки находится в nant, и в какой-то момент мы скомпилируем некоторый код boo, используя nant task. Код boo ссылается на нашу базовую DLL, которая построена из источника C# ранее в процессе сборки.Nant, Booc и x64
Я пробовал две вещи: построить его для запуска в 32-битном режиме и построить его для работы в 64-битном режиме. Используя corflags на нескольких программах (включая booc), я смог построить проект, построенный в 32-битном режиме, но в итоге вошел во множество проблем, связанных с нисходящим потоком. Поэтому мне нужно создать его в 64-битном режиме, который, я думаю, предпочтительнее в любом случае.
В соответствии с исходным кодом nant/booc задача booc nant вызывает текущий процесс booc.exe с использованием класса процессов CLR, поэтому (я думаю) он должен наследовать 32bitness или 64bitness из родительского процесса. Однако это не отражает то, что я вижу.
Вот что я сделал:
- Используется 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. Это приводит к сбою assembly.GetTypes() в режиме 64 бит.