Вопрос

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

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

  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.Это приводит к сбою сборки.GetTypes() завершается с ошибкой в 64-разрядном режиме.

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top