SQL Server: "CREATE ASSEMBLY для сборки" Test "не выполнен, поскольку сборка" Test "искажена или не является чистой сборкой.NET".

Я получаю эту ошибку при попытке загрузить сборку C++/CLI в смешанном режиме в SQL Server 2012:

CREATE ASSEMBLY [Test]
AUTHORIZATION [dbo]
from 'H:\test.dll'
WITH PERMISSION_SET = SAFE

Сообщение 6544, уровень 16, состояние 1, строка 1 СОЗДАТЬ СБОРКУ для сборки "Test" не удалось, поскольку сборка "Test.dll" повреждена или не является чистой сборкой.NET. Неподтверждаемый PE Заголовок / родная заглушка.

2 ответа

Решение

Сборки смешанного режима не допускаются в сборках SQLCLR; разрешены только чистые сборки MSIL. Это подразумевается в документации MSDN для CREATE ASSEMBLY в разделе " Примечания ":

Проверка сборки
SQL Server выполняет проверки двоичных файлов сборки, загруженных с помощью оператора CREATE ASSEMBLY, чтобы гарантировать следующее:

  • Двоичный файл сборки правильно сформирован с допустимыми метаданными и сегментами кода, а сегменты кода имеют действительные инструкции Microsoft Intermediate language (MSIL).

Пожалуйста, смотрите следующий ответ (также здесь, на Stack Overflow) для более подробной информации:

Пользовательский CLR SQL Server завершается с ошибкой "Не удалось загрузить файл или сборку или одну из ее зависимостей. Система не может найти указанный файл".

особенно ссылка на статью Microsoft KB. Политика поддержки для непроверенных сборок.NET Framework в среде SQL Server CLR, в которой говорится об этом ограничении.

Одной из возможных причин, по которой разрешен только управляемый код, является то, что разрешение неуправляемого кода, вероятно, не позволит SQL Server применять определенные ограничения (например, атрибуты защиты хоста и т. Д.) Для SAFE а также EXTERNAL_ACCESS уровни, а также препятствуют проверке.

И при настройке сборки UNSAFE снимает большинство ограничений, этот по-прежнему применяется:

Проверка во время выполнения

Во время выполнения сборка кода проверяется на наличие следующих условий. Если какое-либо из этих условий будет найдено, управляемый код не будет запущен и будет сгенерировано исключение.

UNSAFE

Загрузка сборки - либо путем явного вызова метода System.Reflection.Assembly.Load() из байтового массива, либо неявным образом с использованием пространства имен Reflection.Emit - не допускается.

Цитата выше взята со следующей страницы MSDN: Ограничения модели программирования CLR.

Более подробная информация находится по адресу: CLR Hosted Environment.

Невозможно загрузить сборку C++/CLI в смешанном режиме в SQL Server.

Вы можете загрузить только "чистую" сборку C++/CLI:

Тем не менее, может быть способ обойти это. использование P/Invoke в вашем файле C#. Это эквивалентно написанию оболочки сборки C++/CLI в смешанном режиме, потому что когда CLR кодовые звонки native код в вашей сборке, он выполняет неявное P/Invoke (дайте мне знать, если это работает для вас).

Почему SQL-сервер предотвращает загрузку сборок в смешанном режиме?

Это моя теория:

Если мы вернемся к 2005 году, все было иначе. Когда они выпускали первую версию SQL Server, поддерживающую CLR, сборки в смешанном режиме иногда блокировались при загрузке. Смотрите Microsoft - Смешанная проблема загрузки DLL. Даже после того, как они исправили эту проблему, все еще оставались споры о безопасности и стабильности, которые не позволяли загружать сборки C++/CLI в смешанном режиме в ядро ​​SQL-сервера.

Если кто-нибудь из оригинальной команды разработчиков Microsoft сможет заполнить пробелы, мне было бы очень любопытно!

Другие вопросы по тегам