当 运行 应用程序作为 windows 服务时程序集文件加载错误

assembly file load error when running application as windows service

我有一个应用程序配置为 运行 在控制台上或作为服务(取决于我是手动 运行 .exe 还是安装它)。

运行 它从命令行运行得很好...但是当我将它作为服务安装时,我收到文件加载错误:

System.IO.FileLoadException: Could not load file or assembly 'Microsoft.EntityFrameworkCore.Relational, Version=2.2.0.0'  ... the located assembly's manifest definition does not match the assembly reference.

需要此包,因为我正在使用 EntityFrameworkCore 和 Pomelo 库来查询 MySQL 数据库。我已确保包含所有必需的 NuGet 包并且是最新的。

我已经做了一些事情来纠正这个错误,老实说我看不出我遗漏了什么...

首先,我的程序 运行 在最开始的这一行确保服务 运行ning 来自我期望的目录(而不是 system32):

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);

接下来,我尝试将特定包还原为 v2.0.0.0 以匹配错误描述...不过,一旦我使用还原的包构建它,其他包就会抛出错误,指出它们正在寻找更新的版本 v2.2.6.0

我还尝试删除生产机器上对 v2.0.0.0 的所有引用...所以它甚至不会寻找那个

我的 .csproj 文件只引用了最新版本:

<Reference Include="Microsoft.EntityFrameworkCore.Relational, Version=2.2.6.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
  <HintPath>packages\Microsoft.EntityFrameworkCore.Relational.2.2.6\lib\netstandard2.0\Microsoft.EntityFrameworkCore.Relational.dll</HintPath>
</Reference>

我什至在我的 app.config 文件中有一个绑定重定向,它似乎被完全忽略了:

  <dependentAssembly>
    <assemblyIdentity name="Microsoft.EntityFrameworkCore.Relational" publicKeyToken="adb9793829ddae60" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.2.6.0" newVersion="2.2.6.0" />
  </dependentAssembly>

现在我真的不知道我可能会丢失什么...如上所述,当 运行ning 作为服务时我只会收到文件丢失错误...

当 运行 作为服务时,为什么我的应用程序找不到正确的程序集版本?我该如何解决这个问题?

您是否尝试过 运行在 "normal" 帐户中绑定 service/application?尝试输入您可以交互登录的帐户,然后 运行 将应用程序放到服务的“登录”选项卡上:

(运行 "whoami" 在命令提示符处查找您的帐户名。)

老实说,我仍然不完全确定为什么会这样,但我找到了解决方案...

据我所知,问题确实与 NuGet 包的描述性不够有关。

基本上,发生的事情是我使用的包声明它可以使用 Microsoft.EntityFrameworkCore.Relational 的任何版本,只要它是 2.2.0.0 或更高版本。 NuGet 建议更新到最新版本,所以我做了......恰好是 2.2.6.0。这次更新打破了它...

所以恢复到 2.2.0.0 并删除绑定重定向解决了我的问题。这两件事都必须完成,因为仅恢复到早期版本并不能解决绑定重定向迫使它寻找更高版本的问题...