【问题标题】:Can't load assembly from GAC but it loads from program's folder无法从 GAC 加载程序集,但它从程序的文件夹加载
【发布时间】:2016-05-03 11:24:48
【问题描述】:

我正在使用 .NET Framework 4.0、Entity Framework 6.1.3 和 Sqlite 1.0.96.0 开发 C# 应用程序。

我有一个使用SQLiteMyCompany.Data.Sqlite.Common 的程序集安装在 GAC 上(System.Data.SQLite 也安装在 GAC 上)。

我有两个错误:

'Entity Framework 之前使用了默认实例 DbConfiguration 检测到类型“SQLiteConfiguration”。一个实例 'SQLiteConfiguration' 应该设置在 使用任何功能或实体框架之前的应用程序必须 在应用程序的配置文件中注册。看 http://go.microsoft.com/fwlink/?LinkId=260883 了解更多信息。 '

为了解决这个问题,我在App.config 中添加了以下内容:

<entityFramework codeConfigurationType="MyCompany.Data.Sqlite.Common.SQLiteConfiguration, MyCompany.Data.Sqlite.Common">

但是,在将它添加到App.config 程序后,它不会从 GAC 加载它。

我必须将相同的 dll 复制到 EXEC 文件夹中才能加载并运行程序。

我认为这不是版本号问题或 dll 格式错误,因为我在 GAC 中使用的是相同的 dll。

我也将此添加到App.config

<dependentAssembly>
        <assemblyIdentity name="MyCompany.Data.Sqlite.Common" publicKeyToken="db937bc2d44ff139" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
      </dependentAssembly>

但我必须将 dll 复制到应用程序的文件夹中。

有什么想法吗?

【问题讨论】:

  • 在 GAC 的本机等效项中,程序集是版本化的,并且具有包含哈希的所谓“强”名称 - 而当私有(与应用程序位于同一文件夹中)程序集仅加载使用程序集名称。也许类似的原则适用于此处,并且您没有指定正确版本的程序集,因此无法从 GAC 加载?只是猜测。

标签: c# .net sqlite gac


【解决方案1】:

从 GAC 加载程序集需要完全限定的程序集名称。例如;

<entityFramework codeConfigurationType="MyCompany.Data.Sqlite.Common.SQLiteConfiguration, MyCompany.Data.Sqlite.Common, Version=1.1.1.1, Culture=neutral, PublicKeyToken=ABCD1234567890">

【讨论】:

  • 谢谢。有用!你在哪里找到这些信息的?我一直在搜索很多,我只找到了这种方式:&lt;entityFramework codeConfigurationType="MyCompany.Data.Sqlite.Common.SQLiteConfiguration, MyCompany.Data.Sqlite.Common"&gt;,没有关于 GAC。
  • GAC 可以存储多个版本的程序集,因此要加载一个,您需要通过添加版本、密钥等明确说明哪一个。从软件构建和发布管理的经验中学习:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
相关资源
最近更新 更多