我有一个.NET项目,它总是由/在32位机器上构建/运行。我有一台新的64位计算机,我正在尝试解决它在那里工作的任务。构建脚本是非常的,有一次我们使用nant任务编译一些boo代码。 boo代码引用了我们的核心DLL,它是在构建过程早期从c#source构建的。

我尝试了两件事:将其构建为以32位模式运行,并将其构建为以64位模式运行。通过在几个程序(包括booc)上使用corflags,我能够构建以32位模式构建的项目,但最终在运行时出现了一堆下游问题。所以我需要让它以64位模式构建,我认为无论如何都是这样。

根据nant / booc源代码,booc nant任务使用CLR的Process类调用booc.exe进程,因此(我认为)它应该从父进程继承32bitness或64bitness。但这并没有反映出我所看到的情况。

这就是我所做的:

  1. 使用64位版本的powershell来调用nant
  2. 指定平台=" x64"在我的任务上。我觉得我不应该这样做,因为anycpu应该没问题,但它似乎有所作为。
  3. 这是我得到的错误:

    [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位模式下失败。

有帮助吗?

解决方案

问题是依赖于需要32位模式的第三方DLL,即使它们没有设置corflags也是如此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top