【问题标题】:Npgsql v5.0.0 GAC installationnpgsql v5.0.0 GAC 安装
【发布时间】:2020-12-10 12:33:22
【问题描述】:

如 Npgsql 5.0 版发行说明(重大更改)here 中所述,MSI GAC 安装程序已停止使用。发行说明中的​​声明如下:

Npgsql 不再以 .NET Framework 4.6.1 为目标。自 .NET 标准 2.0 有针对性,仍然可以使用 .NET Framework 中的 Npgsql 应用程序;但是,我们不再在 .NET 上运行回归测试 框架,并且只会在尽力而为的基础上修复错误。此外, Visual Studio 扩展 (VSIX) 和 MSI GAC 安装程序已 停产。 #3269.

由于此更改,我面临的问题是我的客户使用 MSI 安装程序在 GAC 中安装 Npgsql,而我的应用程序使用 System.Data.Common.DbProviderFactories 动态加载其工厂.Net 框架。这让我可以灵活地让客户根据他们的数据库版本选择他们所需的提供程序版本。

切换到 nuget 包安装将增加在我的应用程序中更新 Npgsql 包的开销。因此,我想避开这条路线。有没有办法像 MSI 安装程序那样在 GAC 中安装最新的 Npgsql 5.0 版本?

如果是,请告诉我操作步骤。

【问题讨论】:

    标签: .net npgsql gac


    【解决方案1】:

    最后,我通过使用 gacutil.exe 在 GAC 中注册所有程序集来使其工作。

    我在我的应用程序中使用 .Net framework 4.6.1,并且我已执行以下步骤在 GAC 中安装 Npgsql 版本 5.0.0.0:

    1. 在新的 Visual Studio 项目中添加所需版本的 Npgsql .Net 数据提供程序的引用。

    2. 在文件夹中查找并复制此提供程序添加的所有程序集。

    3. 现在我们需要使用 gacutil.exe 在 GAC 中注册这些程序集。它可以与 Visual Studio 命令提示符一起使用,也可以与 Windows SDK 一起使用。

    4. 使用具有管理员权限的命令并为每个程序集运行以下命令。 gacutil.exe /i "AssemblyPath/assemblyName.dll"

    对于 5.0.0.0 版本,完整的命令列表如下:

       gacutil.exe /i Npgsql.dll
       gacutil.exe /i Microsoft.Bcl.AsyncInterfaces.dll
       gacutil.exe /i System.Buffers.dll
       gacutil.exe /i System.Memory.dll
       gacutil.exe /i System.Numerics.Vectors.dll
       gacutil.exe /i System.Runtime.CompilerServices.Unsafe.dll
       gacutil.exe /i System.Text.Encodings.Web.dll
       gacutil.exe /i System.Text.Json.dll  
       gacutil.exe /i System.Threading.Channels.dll
       gacutil.exe /i System.Threading.Tasks.Extensions.dll
       gacutil.exe /i System.ValueTuple.dll
    
    1. 现在在 machine.config 文件中的两个位置添加以下条目

    位置 1: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config

    位置 2: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config

    配置条目:

     <system.data>
            <DbProviderFactories><add name="Npgsql Data Provider" invariant="Npgsql" description=".NET Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5D8B90D52F46FDA7"/></DbProviderFactories>
     </system.data>
    
    1. 在当前版本 5.0.0.0 中,Npgsql 试图找出低版本的依赖程序集。我认为这是一个错误,他们可能会在以后的版本中解决这个问题,但现在我们需要在我们的应用程序 App.confg 文件中创建一些依赖程序集的条目来使用这些版本。

    YourApplication.exe.config 可以在安装目录中找到,您需要在&lt;assemblyBinding&gt; 部分下添加以下行:

    <dependentAssembly>
    <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
    </dependentAssembly>
    <dependentAssembly>
    <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
    </dependentAssembly>
    <dependentAssembly>
    <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
    </dependentAssembly>
    <dependentAssembly>
    <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
    </dependentAssembly>
    

    现在我可以轻松地在我的应用程序中获取 DbProviderFactory 实例,而不会出现任何问题。

    【讨论】:

      【解决方案2】:

      Npgsql 5.0 不再以 .NET Framework(net461TFM)为目标,仅以netstandard2.0TFM(以及一些较新的)为目标。因此无法再将其安装到 GAC 中。

      DbProviderFactories 仍然可以在没有 GAC 的情况下使用 - 使用 .NET Framework 或 .NET Core - 但 Npgsql 程序集必须与应用程序一起分发或作为“插件”放入其目录中。

      【讨论】:

      • 这是我主要关心的问题,我想避免将 Npgsql 与我的应用程序捆绑在一起,否则我可以使用 Nuget 轻松捆绑它。
      • AFAIK,使用 Npgsql 5.0.0 无法将其安装到 GAC 中。与应用程序捆绑(或允许用户以某种方式将其安装到您的应用程序中)是您唯一的选择。
      • 既然你是 Npgsql 的所有者,我不得不相信没有别的办法 :) 很高兴知道你在这里很活跃,直接从你那里得到答案当然是很有意义的。非常感谢您的时间和帮助。
      • 谢谢...我可以肯定地说,Npgsql 5.0.0 不再针对任何 .NET Framework TFM - 仅针对 .NET Standard 和 .NET Core。我不太确定的是是否可以在 GAC 中安装 netstandard2.0 程序集 - 您可以使用 gacutil -i 手动尝试
      • 我通过使用 gacutil 在 GAC 中注册 Npgsql.dll 5.0.0.0 并在 machine.config 文件中创建条目来获得 DbProviderFactory 实例,但是在执行任何操作时它会为依赖文件引发错误。这是我得到的错误 Could not load file or assembly 'System.Threading.Channels, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 或其依赖项之一。系统找不到指定的文件。'我还需要在 GAC 中找出并注册所有依赖程序集吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多