【问题标题】:Could not load file or assembly MySql.Data, referencing two files in exception无法加载文件或程序集 MySql.Data,在异常中引用了两个文件
【发布时间】:2021-07-10 14:22:54
【问题描述】:

搜索了 SO,但找不到有效的解决方案。

在 Visual 中,我有一个主要项目。它使用编译为 DLL 的另一个项目 (ProjectA)。该项目使用 Servicestack ORMLite 4.5.14。我还安装了Mysql.Data 6.9.12。 ProjectA 是 Project 在主项目中的引用,而不是编译后的 DLL。

已编译的应用程序被复制到另一台 PC(仅复制,不安装)并启动。但是,当它尝试使用 ProjectA 访问数据库时,出现以下错误:

System.IO.FileLoadException: Could not load file or assembly 'MySql.Data, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'MySql.Data, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' ---> System.IO.FileLoadException: Could not load file or assembly 'MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d'

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].


   at ServiceStack.OrmLite.MySql.MySqlDialectProvider.CreateConnection(String connectionString, Dictionary`2 options)
   at ServiceStack.OrmLite.OrmLiteConnection.get_DbConnection()
   at ServiceStack.OrmLite.OrmLiteConnection.Open()
   at ServiceStack.OrmLite.OrmLiteConnectionFactory.OpenDbConnection()
   at ServiceStack.OrmLite.OrmLiteConnectionFactoryExtensions.Open(IDbConnectionFactory connectionFactory)
   at ProjectA.Repositories.ARepository.FindById(String id)
   at ProjectA.Controllers.AController.FindById(String id)
   at ProjectA.Service.DatabaseService.Find(String id)

我尝试解决的问题:

  • 编译 ProjectA 并使用 DLL 作为参考,而不是直接在解决方案中使用项目
  • 卸载了Mysql.Data和ServiceStack ORMlite的所有引用并重新安装
  • 更改了 .Net 框架版本(4.5.2 及更高版本)
  • 在应该运行应用程序的机器上安装 Mysql 连接器
  • 安装Mysql.Data 8.0
  • 删除了目录中的mysql.data.dll,以便将其复制回来。检查 DLL 的版本,它与 6.9.12 匹配
  • 在 .csproj 文件中搜索 Mysql.data 8.0 和 6.9.9,但找不到参考

由于它使用的是旧的 Mysql 服务器,因此需要旧版本的 Mysql.Data,因此还需要旧版本的 ServiceStack ORM lite。

我之前也遇到过这个问题,ProjectA也用在另一个需要Mysql 8.0的项目中。由于它被引用为项目(而不是 DLL 文件),因此它来回更改。但是,过去重新安装Mysql.dataService Stack ORM lite 确实解决了这个问题。但现在我无法克服这个错误。我确保解决方案中所有项目的版本都相同。我知道这是不好的做法,但由于我们正在重写完整的应用程序,直到现在才可行。

有解决这个问题的建议吗?

【问题讨论】:

  • 安装 安装 Mysql 连接器应该可以工作。您是否为所有用户安装?你可以作为管理员安装,而不是从不同的帐户尝试。您是从 VS 内部运行还是仅运行 EXE。 VS 除非您右键单击 VS 快捷方式并选择以管理员身份运行,否则您不会获得管理员权限。您在构建和部署机器上是否有相同版本的 Mysql?用记事本打开csproj文件,看看参考里面是什么版本的mysql。检查exe文件的debug和release版本是否在原机上运行。
  • 尝试以下操作:在 Visual Studio 中,打开解决方案资源管理器(查看 => 解决方案资源管理器),右键单击 。选择Manage NuGet Packages...。点击Browse。在搜索框中输入MySql.Data。点击MySql.Data。点击Install

标签: c# .net mysql-connector ormlite-servicestack mysql.data


【解决方案1】:

原来obj 中有一个缓存目录,其中包含一个引用 Mysql.Data 版本 6.9.9 的服务堆栈 xml 文件。即使在使用 NuGet 包管理器删除 ServiceStack 和 Mysql.Data 包并重新安装正确版本后,此版本号仍显示在 de debug 构建目录中的 ServiceStack xml 文件中。

卸载ServiceStack和Mysql.Data包,删除构建目录(debug和release),删除obj目录,重新安装ServiceStack和Mysql.Data包解决。

感谢@jdwang 和@user9938 的回答。

【讨论】:

    猜你喜欢
    • 2014-11-19
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多