【问题标题】:Why can't I install my service (runtime newer than loaded runtime)?为什么我不能安装我的服务(运行时比加载的运行时新)?
【发布时间】:2011-05-12 02:58:18
【问题描述】:

所以我用 C# 构建了一个服务,并尝试使用以下命令来安装它:

C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\installutil.exe MyService.exe >> installLog.txt

失败了。当我查看 installLog.txt 时,我得到了这个:

Microsoft (R) .NET Framework Installation utility Version 2.0.50727.3053
Copyright (c) Microsoft Corporation.  All rights reserved.

Exception occurred while initializing the installation:
System.BadImageFormatException: Could not load file or assembly 'file:///C:\MyService.exe' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded..

同样的方法适用于安装不同的程序集。我觉得可能是因为失败的是为 .NET 4.0 编写的,而有效的是 3.5 中的。

有人遇到过这个问题吗?

【问题讨论】:

  • 如果您在 .net 4.0 中构建设置,则必须将 .net 4 部署到服务器
  • 但是我可以在 Visual Studio 中构建项目本身。这不应该意味着.NET 4.0 已经安装了吗?
  • 刚刚尝试安装它 - 它已经安装了。
  • 不是 32/64 位问题吧?
  • 我已经尝试过 installutil 的 32 位和 64 位版本;两者都不起作用。

标签: c# .net windows-services failed-installation


【解决方案1】:

为此浪费了一个小时,我所要做的就是为服务路径添加引号。

步骤 1) cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

如图所示将.exe路径的目录加引号

步骤 2) InstallUtil.exe "E:\MyNewService\MyNewService\bin\Debug\MyNewService.exe"

参考:https://www.codeproject.com/Answers/5143174/Installing-windows-service-error-installutil-exe-i#answer5

【讨论】:

    【解决方案2】:

    遇到同样的问题,上面的内容对 windows server 2019 没有任何帮助

    尝试运行兼容性测试,之后注册突然起作用:

    【讨论】:

      【解决方案3】:

      如果您的应用程序是针对 .Net 4.0 构建的,则您使用了错误的 installutil.exe。使用 4.0 文件夹中的 installutil.exe。

      对于 x86:

      C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe

      对于 x64:

      C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil.exe

      【讨论】:

      • 如何将其设为默认的“installutil.exe”?
      • @louisrhys 将 4.0 框架目录添加到您的路径中。如果您只想更改 Visual Studio 命令提示符,则可以修改系统路径以使其适用于所有 cmd 提示符或 vcvarsall.bat。
      • @DarrylBraaten ...这是解决方案:)
      • 请注意这一点,因为您必须确保您的目标是 x86 或 x64 - 在这种情况下,...\Framework64\... 不是正确的路径。对于 x86,您将使用它:C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe。如果您尝试使用不正确的架构进行构建,您也会收到此错误,即使框架版本看似正确。
      【解决方案4】:

      如果您尝试了上述所有方法但仍然看到相同的错误,请仔细检查您是否有 32 位应用程序或任何 32 位 DLL,并且您的服务器是 64 位服务器。

      【讨论】:

        【解决方案5】:

        没有人能接近得到这个!

        这是我必须做的:

        1. 在 Visual Studio 中右键单击服务项目,转到“属性”
        2. 将“启动对象”设置为服务的名称(它已设置为值“(未设置)”)。
        3. 保存。
        4. 构建
        5. 再次尝试安装。
        6. 有效!耶!我们都可以回家了!

        链接到提供帮助的code project article

        【讨论】:

        • 我从 .NET 2.0 升级到 4.0 时遇到了同样的问题。除了缺少 Startup 对象之外,Setup and Deployment 项目还引用了 .NET 2.0 作为先决条件。我需要在先决条件对话框中更新对 .Net 4.0 的引用并将我的 .NET Framework 引导程序更新到 4.0。
        • 我从不了解 MS “技术” :-(。为我工作,谢谢。
        • 除 xr280xr 之外的另一个提示:如果您的 Visual Studio 在 XP (x86) 上运行并且您为 Windows 7x64 创建了一个包含 32 位代码的安装程序包,则在编译时您会收到一条警告,告诉您该框架版本不匹配 - 您可以忽略此消息。为 x64 CPU 设置安装程序,但将项目(您的代码)定位为 x86 CPU 或任何 CPU(除非您有 32 位第 3 方 DLL),以使其在 Windows 7x64 上正确运行。这是它对我有用的唯一方法......
        【解决方案6】:

        对我来说,我只是右键单击要安装的 exe,然后单击“取消阻止”

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题。最初,我的项目位于项目调试文件夹内的 D:\ 上的一条很长的路径中。 当我将 .exe 服务文件移动到另一个路径较短的位置并以“C:\”开头时,问题得到了解决。

          我也使用这个批处理文件来安装我的服务

          @ECHO OFF
          
          REM Directory for .NET 4. Check for other version directories.
          set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319
          set PATH=%PATH%;%DOTNETFX2%
          
          echo Installing MyService...
          echo ---------------------------------------------------
          InstallUtil /i C:\ServiceFolder\MyService.exe
          echo ---------------------------------------------------
          echo Done.
          pause
          

          【讨论】:

          • 我怀疑它既不是路径的长度,也不是它所在的驱动器,而是文件夹名称中的空格字符,您可以通过包含服务文件来开始工作双引号中的路径。
          【解决方案8】:

          如果您在 x64 机器上编译,请务必进入 Configuration Mgr 并将构建更改为 x64。当然,您需要检查以确保您使用的是正确版本的 InstallUtil.exe。祝你好运。

          【讨论】:

          • 我的问题是它是为 x64 编译的,但我使用的是 x86 installutil。这是一个很好的提示
          【解决方案9】:

          对于那些没有发现这可以解决他们的问题的人,您需要查看 .vdproj 文件的启动条件并将 .NET 框架更改为 4:http://www.alexjamesbrown.com/uncategorized/deploying-net-4-project-error-1001-system-badimageformatexception/

          【讨论】:

          • 谢谢!是的,我也转换了一个 2.0 项目,直到你指出来才发现。
          【解决方案10】:

          您是否尝试过在包含 Windows 服务的目录中的命令提示符窗口中简单地键入 MyService.exe /install?这在过去对我有用。您也可以使用MyService.exe /uninstall 卸载 Windows 服务。

          【讨论】:

          • 这通常不适用于 .NET 服务,除非作者手动添加了代码来处理 /install。这些参数曾经是旧 C++ 服务的自动生成代码的一部分,因此曾经很常见 - 现在不再如此了。
          • @O'Rooney:你很可能是正确的。较旧的 Windows 服务更有可能以这种方式工作。
          【解决方案11】:

          我相信你在你的问题中提供了答案:

          “此程序集由比当前加载的运行时更新的运行时构建,无法加载..”

          因此,您可能使用较新的函数(在较新的框架中)编译了运行时,但您注册它的计算机运行的是较低版本。

          例如。为 .NET 3.5 编译,但之后在 .NET 2.0 上安装该服务没有意义。

          由于您能够在目标机器上安装服务,我猜您已经是管理员了。因此,只需升级该服务机器上的 .NET 框架即可。

          【讨论】:

          • 哦,其他人也发表了评论。不知道
          • 这是一个.NET 4.0的项目,机器上安装了.NET 4.0。我正在尝试安装在我一直在编码的同一台机器上 - 我认为如果这是一个问题,它会更早出现。
          • 但是你使用的是2.0的安装服务? "\Framework64\v2.0.50727\installutil.exe"
          • 我用这个:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil.exe
          • 事实并非如此,请参阅我在上面答案下的评论。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-10
          • 2010-09-21
          • 1970-01-01
          • 1970-01-01
          • 2021-05-28
          • 1970-01-01
          相关资源
          最近更新 更多