我有一个始终由 32 位机器构建/运行/运行的 .NET 项目。我有一台新的 64 位计算机,并试图解决让它在那里工作的任务。构建脚本在 nant 中,有一次我们使用 nant 任务编译了一些 boo 代码。boo 代码引用了我们的核心 DLL,它是在构建过程的早期从 c# 源构建的。
我尝试了两件事:将其构建为在 32 位模式下运行,并将其构建为在 64 位模式下运行。通过在几个程序(包括 booc)上使用 corflags,我能够构建以 32 位模式构建的项目,但最终在运行时遇到了一堆下游问题。所以我需要让它以 64 位模式构建,无论如何我认为这是更可取的。
根据 nant/booc 源代码,booc nant 任务使用 CLR 的 Process 类在进程内调用 booc.exe,因此(我认为)它应该从父进程继承 32 位或 64 位。不过,这并不能反映我所看到的。
这是我所做的:
- 使用64位版本的powershell调用nant
- 在我的任务中指定了 platform="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 位模式下失败。