Как зарегистрировать PdfSharp для SQL CLR в SQL Server 2014? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть хранимая процедура CLR, которая вызывает PdfSharp 1.32.3057.0 для создания PDF-файла по заданному запросу. PdfSharp отлично регистрируется на локальном сервере разработки (Windows 2012 / SQL Server 2014), но не на сервере QA (Windows 2008 r2 / SQL Server 2014).

Была предпринята попытка регистрации pdfsharp под учетной записью SA, которая является dbo для 'util' db.

CREATE ASSEMBLY [PdfSharp] 
           FROM 'c:\SqlClr\PdfSharp.dll'
WITH PERMISSION_SET = UNSAFE

Предупреждение : сборка Microsoft .NET Framework 'system.windows.forms, версия = 2.0.0.0, культура = нейтральная, publickeytoken = b77a5c561934e089, processorarchitecture = msil.' Ваша регистрация не полностью протестирована в среде, размещенной на SQL Server, и не поддерживается. В будущем, если вы обновите или обслужите эту сборку или .NET Framework, ваша процедура интеграции CLR может перестать работать. Пожалуйста, обратитесь к электронной документации по SQL Server для получения более подробной информации.

Сообщение 6586, Уровень 16, Состояние 1, Строка 118
Сборка «System.Windows.Forms» не может быть установлена, поскольку существующая политика не позволит использовать ее

is_trustworthy включен для утилизации дБ.

.NET 4.7.2 и .NET 3.5.1 установлены на сервере QA.

Как зарегистрировать эту сборку без ошибок?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

1) Это плохая идея . Для этого вам следует использовать внешнюю программу, возможно, просто PowerShell через агент SQL.

2) Вот как это сделать.

Сборка, которую вы пытаетесь загрузить, ссылается на сборки .NET Framework, которых нет в «благословенном списке» для SQL Server, а это означает, что они не тестируются и не поддерживаются для запуска in-proc. И чтобы использовать их, вы должны скопировать их в свою базу данных.

После того, как вы скопируете сборки .NET Framework в свою базу данных, вы должны обновлять их каждый раз, когда изменяется версия .NET Framework на хосте (включая исправления и незначительные изменения версии), или когда ваша база данных работает на другом сервере (например, при отказе). Кто-то забудет это сделать, и ваше приложение упадет.

SQL 2012 и более поздние версии используют .NET Framework 4. Нет ничего страшного в том, что приложение было построено на основе .NET 2; это будет работать в 4 (вероятно). А ссылки на сборки .NET Framework 2 будут автоматически перенаправлены на версии .NET 4. Но это означает, что вы должны установить версии .NET 4 с сервера в вашу базу данных. Полный список, который вам нужен для работы System.Windows.Forms.dll:

system.windows.forms, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil
system.drawing, version=4.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a, processorarchitecture=msil
accessibility, version=4.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a, processorarchitecture=msil
system.runtime.serialization.formatters.soap, version=4.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a, processorarchitecture=msil

Все эти сборки расположены в:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319
0 голосов
/ 06 ноября 2018
  1. .NET Framework версии 3.5.1 здесь не имеет значения, поскольку вы используете SQL Server 2014, который привязан только к * CLR версии 4.0 (и, следовательно, .NET Framework версии 4.0 и новее, по крайней мере, до 4.7.2).

  2. Каким-то образом вы указываете на неверную версию библиотеки System.Windows.Forms. Ошибка сообщает 'system.windows.forms, version=2.0.0.0,..., что для CLR версии 2.0, а не CLR версии 4.0. Поэтому вам нужно поместить файл System.Windows.Forms.dll из .NET 4.x в c: \ SqlClr \ , чтобы он мог автоматически загружаться при попытке загрузки PDFsharp.

  3. Необходимо выполнить тщательное тестирование, при котором несколько одновременно работающих пользователей одновременно получают доступ к этому объекту SQLCLR. Я не изучал PdfSharp, но если причина этого UNSAFE в том, что статические переменные класса используются для кэширования значений производительности, это может легко вызвать странное, неожиданное и непредсказуемое поведение, так как домены приложений в SQL Server являются общими для всех сеансов. Это означает, что несколько одновременно работающих пользователей имеют доступ к одним и тем же статическим переменным класса. Это может привести к условиям гонки, когда один пользователь перезаписывает значение, используемое другим пользователем. Вам нужно будет попытаться загрузить PdfSharp как SAFE или EXTERNAL_ACCESS, чтобы увидеть, какое сообщение об ошибке возвращается, что должно указывать хотя бы на одну причину, по которой эту библиотеку необходимо пометить как UNSAFE.

    .

    Если статические переменные класса используются для кэширования значений для выполнения, то вам следует:

    1. добавить ключевое слово readonly в объявление переменной статического класса и перекомпилировать. Когда вы компилируете, если в коде есть места, которые пишут в эту переменную, они будут генерировать ошибки. Вам нужно будет исправить каждое место, где это происходит. Вы можете попытаться удалить ключевое слово «static» (и, очевидно, не добавлять «только для чтения»), сделав его переменной экземпляра, что безопасно для использования.
    2. не использовать решение и найти что-то еще

Для получения дополнительной информации о работе с SQLCLR в целом, пожалуйста, посетите: SQLCLR Info

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...