Npgsql v5.0.0 GAC инсталация

Както е посочено в бележките по изданието на Npgsql версия 5.0 (Взломни промени) тук , програмата за инсталиране на MSI GAC е прекратена. Изявлението от бележките към изданието е дадено по-долу:

Npgsql вече не е насочен към .NET Framework 4.6.1. Тъй като е насочен към .NET Standard 2.0, все още е възможно да се използва Npgsql от приложения на .NET Framework; обаче вече не провеждаме регресионни тестове на .NET Framework и ще коригираме грешки само на основата на най-доброто усилие. Освен това разширението Visual Studio (VSIX) и инсталаторът на MSI GAC са преустановени. #3269.

Проблемът, с който се сблъсквам поради тази промяна, е, че клиентите ми използваха инсталатора на MSI, за да инсталират Npgsql в GAC и приложението ми зарежда фабричните си данни динамично, използвайки System.Data.Common.DbProviderFactory на .Net framework. Това ми дава гъвкавостта да позволя на клиента да избере необходимата версия на доставчика в зависимост от версията на базата данни.

Преминаването към инсталация на пакет nuget ще добави допълнителни разходи за актуализиране на пакети Npgsql в моето приложение. Затова искам да избегна този маршрут. Има ли някакъв начин да инсталирате най-новата версия на Npgsql 5.0 в GAC, както е направено от инсталатора на MSI?

Ако да, моля, уведомете ме за стъпките, за да го направя.


person prem    schedule 10.12.2020    source източник


Отговори (2)


Най-накрая го накарах да работи, като регистрирах всички сборки в GAC с помощта на gacutil.exe.

Използвам .Net framework 4.6.1 в моето приложение и изпълних следните стъпки, за да инсталирам Npgsql версия 5.0.0.0 в GAC:

  1. Добавете референцията на необходимата версия на доставчика на данни Npgsql .Net в нов проект на Visual Studio.

  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 в моето приложение без проблем.

person prem    schedule 23.12.2020

Npgsql 5.0 вече не е насочен към .NET Framework (net461 TFM), а само към netstandard2.0 TFM (както и някои по-нови). Така че вече не е възможно да го инсталирате в GAC.

DbProviderFactory все още може да се използва без GAC - с .NET Framework или .NET Core - но сборката Npgsql ще трябва да бъде разпространена с приложението или пусната в неговата директория като плъгин.

person Shay Rojansky    schedule 10.12.2020
comment
Това е основната ми грижа, искам да избегна групирането на Npgsql с моето приложение, в противен случай мога лесно да го пакетирам с помощта на Nuget. - person prem; 11.12.2020
comment
AFAIK, с Npgsql 5.0.0 няма начин да го инсталирате в GAC. Обединяването с приложението (или позволяването на потребителите да го инсталират във вашето приложение по някакъв начин) е единственият ви избор. - person Shay Rojansky; 11.12.2020
comment
Тъй като сте собственик на Npgsql, трябва да вярвам, че няма друг начин :) Страхотно е да знам, че сте активен тук и със сигурност е ценно да получавам отговорите директно от вас. Благодаря много за отделеното време и помощта. - person prem; 11.12.2020
comment
Благодаря... Това, което мога да кажа със сигурност, е, че Npgsql 5.0.0 вече не е насочен към .NET Framework TFM - само към .NET Standard и .NET Core. Това, за което съм по-малко сигурен, е дали е възможно да инсталирате сборка netstandard2.0 в GAC - можете да опитате това ръчно с gacutil -i - person Shay Rojansky; 11.12.2020
comment
Да, ще опитам, благодаря отново. - person prem; 11.12.2020
comment
Получих екземпляра на DbProviderFactory, като регистрирах Npgsql.dll 5.0.0.0 в GAC с помощта на gacutil и направих запис във файла machine.config, но той извежда грешка за зависимите файлове, докато извършва каквато и да е операция. Ето грешката, която получих Не можах да заредя файл или сборка „System.Threading.Channels, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51“ или една от неговите зависимости. Системата не може да намери посочения файл.' Трябва ли да намеря и да регистрирам всички зависими сборки в GAC? - person prem; 16.12.2020
comment
Да, трябва да инсталирате и всички зависими модули в GAC. - person Shay Rojansky; 16.12.2020
comment
Накарах го да работи, като регистрирах всички сборки в GAC с помощта на gacutil.exe и публикувах всички стъпки в моя отговор. Благодаря отново за помощта. - person prem; 23.12.2020