2009-03-03 5 views
1

У меня есть проект .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 из родительского процесса. Однако это не отражает то, что я вижу.

Вот что я сделал:

  1. Используется 64-битная версия PowerShell для вызова NANT
  2. Указана платформы = «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 бит.

ответ

0

Проблема заключается в зависимостях от сторонних DLL, которые требуют 32-битного режима, что возможно, даже если у них нет установленных флагов.

Смежные вопросы