npgsql v5.0.0 GAC安装

Npgsql v5.0.0 GAC installation

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

Npgsql no longer targets .NET Framework 4.6.1. Since .NET Standard 2.0 is targeted, it is still possible to use Npgsql from .NET Framework applications; however, we no longer run regression tests on .NET Framework and will only fix bugs on a best-effort basis. In addition, the Visual Studio extension (VSIX) and the MSI GAC installer have been discontinued. #3269.

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

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

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

Npgsql 5.0 不再针对 .NET Framework(net461 TFM),仅针对 netstandard2.0 TFM(以及一些较新的)。所以不能再安装到GAC中了。

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

最后,我通过使用 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可以在安装目录下找到,你需要在<assemblyBinding>部分添加下面几行:

<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 实例,没有任何问题。