Установка GAC Npgsql v5.0.0

Как указано в примечаниях к выпуску 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.DbProviderFactories из >.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 путь к сборке/имя_сборки.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.

DbProviderFactories по-прежнему можно использовать без GAC — либо с .NET Framework, либо с .NET Core, — но сборку Npgsql придется распространять вместе с приложением или помещать в его каталог в качестве подключаемого модуля.

person Shay Rojansky    schedule 10.12.2020
comment
Это моя главная забота, я хочу избежать связывания Npgsql с моим приложением, иначе я могу легко связать его с помощью Nuget. - person prem; 11.12.2020
comment
Насколько я знаю, с 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, версия = 4.0.2.0, культура = нейтральная, 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