#.net #npgsql #gac
#.net #npgsql #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.Обычный.DbProviderFactories .Net framework. Это дает мне гибкость, позволяющую клиенту выбирать требуемую версию поставщика в зависимости от версии их базы данных.
Переключение на установку пакета nuget приведет к дополнительным затратам на обновление пакетов Npgsql в моем приложении. Поэтому я хочу избежать этого маршрута. Есть ли какой-либо способ по-прежнему устанавливать последнюю версию Npgsql 5.0 в GAC, как это делается установщиком MSI?
Если да, пожалуйста, дайте мне знать, как это сделать.
Ответ №1:
Наконец, я заработал, зарегистрировав все сборки в GAC с помощью gacutil.exe .
Я использую .Net framework 4.6.1 в моем приложении, и я выполнил следующие шаги для установки Npgsql версии 5.0.0.0 в GAC:
- Добавьте ссылку на требуемую версию Npgsql.Поставщик сетевых данных в новом проекте Visual Studio.
- Найдите и скопируйте все сборки, добавленные этим поставщиком, в папку.
- Теперь нам нужно использовать gacutil.exe зарегистрировать эти сборки в GAC. Он может использоваться с командной строкой Visual Studio или поставляется с Windows SDK.
- Используйте команду с правами администратора и выполните приведенную ниже команду для каждой сборки. gacutil.exe /я «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
- Теперь добавьте приведенную ниже запись в файл machine.config в двух местах
Расположение 1: C:WindowsMicrosoft.NETFramework64v4.0.30319Configmachine.config
Расположение 2: C:WindowsMicrosoft.NETFrameworkv4.0.30319Configmachine.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>
- В текущей версии 5.0.0.0 Npgsql пытается выяснить более низкие версии зависимых сборок. Я думаю, что это ошибка, и они могут исправить эту проблему в более поздних версиях, но сейчас нам нужно сделать некоторые записи зависимых сборок в нашем приложении App.confg файл, чтобы использовать эти версии вместо.
Ваш файл .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 в своем приложении без каких-либо проблем.
Ответ №2:
Npgsql 5.0 больше не нацелен на .NET Framework ( net461
TFM), только на netstandard2.0
TFM (а также на некоторые более новые). Таким образом, больше невозможно установить его в GAC.
DbProviderFactories по-прежнему можно использовать без GAC — либо с .NET Framework, либо с .NET Core, но сборку Npgsql придется распространять вместе с приложением или помещать в его каталог в качестве «плагина».
Комментарии:
1. Это моя главная проблема, я хочу избежать объединения Npgsql с моим приложением, иначе я могу легко связать его с помощью Nuget.
2. AFAIK, с Npgsql 5.0.0 нет способа установить его в GAC. Объединение с приложением (или разрешение пользователям каким-либо образом устанавливать его в ваше приложение) — ваш единственный выбор.
3. Поскольку вы являетесь владельцем Npgsql, я должен верить, что другого пути нет 🙂 Приятно знать, что вы здесь активны, и, безусловно, приятно получать ответы непосредственно от вас. Большое спасибо за ваше время и помощь.
4. Спасибо… Что я могу сказать наверняка, так это то, что Npgsql 5.0.0 больше не нацелен на какой-либо .NET Framework TFM — только .NET Standard и .NET Core. В чем я менее уверен, так это в том, возможно ли установить сборку netstandard2.0 в GAC — вы можете попробовать это вручную с помощью gacutil -i
5. Я получил экземпляр DbProviderFactory, зарегистрировав Npgsql.dll 5.0.0.0 в GAC с использованием gacutil и внесением записи в файл machine.config, но при выполнении любой операции он выдает ошибку для зависимых файлов. Вот ошибка, которую я получил, не удалось загрузить файл или сборку ‘System. Многопоточность. Каналы, версия = 4.0.2.0, Культура = нейтральная, PublicKeyToken = cc7b13ffcd2ddd51′ или одна из его зависимостей. Система не может найти указанный файл.’ Нужно ли мне также находить и регистрировать все зависимые сборки в GAC?