【问题标题】:windows service with 32 bit and 64 bit dlls具有 32 位和 64 位 dll 的 Windows 服务
【发布时间】:2009-12-04 08:26:04
【问题描述】:

我们有一个 Windows 服务,它使用从一堆不同的 .NET 项目生成的 dll。其中一个项目依赖于在 32 位机器上编译的 dll。

我们刚刚将 Windows 服务移到了 64 位机器上。默认情况下,.NET 项目尝试作为 64 位程序集运行(因为它们在 64 位机器上运行)。但是,我可以通过将平台目标指定为“x86”而不是“任何 CPU”来强制单个项目作为 32 位程序集运行。

我的问题是:所有 .NET 项目都需要强制作为 32 位程序集运行吗? 32 位程序集和 64 位程序集可以一起运行吗?

【问题讨论】:

    标签: windows-services 64-bit


    【解决方案1】:

    我认为,只要您不使用本机模块或其他任何东西,您可能没问题,但如果您在任何地方假设指针的大小等,您的代码中仍然可能存在错误。

    “如果你有 100% 类型安全的托管代码,那么你真的可以将它复制到 64 位平台并在 64 位 CLR 下成功运行。”

    http://www.hanselman.com/blog/CommentView.aspx?guid=4099df2d-ef01-4f70-a7f7-829eabc36afc

    【讨论】:

      【解决方案2】:

      如果非托管 dll 上没有不安全代码和/或引用,您可以使用目标 Any CPU 安全地编译所有内容。

      编译的结果与 CPU 无关 - 生成的 IL 是 JIT - 由 CLR 在目标机器上编译,无论机器是什么。

      如果盒子是 64 位的盒子,它将被 64 位 CLR 编译为 64 位指令集,并且将在本机 64 位模式下愉快地运行

      【讨论】:

      • 其中一个引用是第三方 dll,它似乎在 32 位机器上运行良好,但在 64 位机器上抛出错误。 (即我无法重新编译该 Dll,并且我不能保证它是使用目标“任何 CPU”编译的)基本上该解决方案在 32 位机器上运行良好,但在 64 位机器上 apachefop.net 抛出错误“无法加载文件或程序集'apachefop.net试图加载格式不正确的程序。”,我想知道是否必须转换单个项目(具有依赖项的项目)或者是否必须转换解决方案中的每个项目。
      猜你喜欢
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      相关资源
      最近更新 更多