Почему SQL Server не регистрирует мою сборку как БЕЗОПАСНУЮ?

В SQL Server 2008 я пытаюсь зарегистрировать сборку, которая, кажется, ссылается только на поддерживаемые библиотеки. Вот код T-SQL, который я использую для регистрации сборки:

create assembly MySpatial from 'c:\Spatial.dll'

Это приводит к следующей ошибке:

Msg 6509, уровень 16, состояние 31, строка 1 Произошла ошибка при сборе метаданных из сборки Spatial с HRESULT 0x80004005.

Однако, если я добавлю with permission_set=unsafe, SQL успешно выполнит команду. Как я могу узнать, почему произошла ошибка или почему моя сборка должна быть зарегистрирована как небезопасная?


person Holistic Developer    schedule 29.10.2009    source источник
comment
У меня такая же проблема с моей сборкой. Нет никаких статических полей / свойств, отличных от readonly, и они ссылаются только на безопасные mscorlib.dll и System.dll, оба v2. Я попытался скопировать ограниченную часть классов в отдельный файл и скомпилировать, что работает, так что есть что-то конкретное, что мешает принять его как безопасный.   -  person Allon Guralnek    schedule 28.01.2010
comment
Я обнаружил проблему с моей сборкой, у нее есть некоторые лямбда-выражения внутри метода GetEnumerator(), поэтому я преобразовал их в обычные методы + new Func<> (преобразование их в анонимные методы не помогло). Это позволило мне добавить сборку в SQL Server, не получая ошибки. Я до сих пор не знаю, почему эти лямбда-выражения вызвали это (они могли нормально компилироваться и работать вне SQL Server).   -  person Allon Guralnek    schedule 28.01.2010


Ответы (2)


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

Я думаю, это потому, что если лямбда захватывает какие-либо переменные, это не вызывает проблемы с БЕЗОПАСНОСТЬЮ. Было бы разумно, если бы он собирал переменные, вам нужно было бы создавать другого делегата для каждого его вызова, но если лямбда полностью самодостаточна, она могла бы кэшировать ее в целях повышения эффективности.

Microsoft исправила проблему в SQL 2008, но не решит ее в SQL 2005, поэтому, если есть необходимость в поддержке существующих установок SQL 2005, все, что для этого требуется, - это исключить «статически оптимизируемые» лямбды, а не все лямбды в целом. сборка.

person Bryce Wagner    schedule 18.06.2013

Когда набор разрешений небезопасен, SQL не проверяет метаданные вашей сборки.

Попробуйте применить исправление из KB 941256 или примените CU4 для SP2. Хотя HRESULT отличается от E_FAIL, которое вы получаете, возможно, исправление решает проблему.

person Remus Rusanu    schedule 29.10.2009
comment
Конечно, я понимаю, что когда разрешения установлены на небезопасный, SQL просто пропустит его. Однако я пытаюсь выяснить, что именно небезопасно в моей сборке? Кроме того, предоставленные вами ссылки относятся только к SQL Server 2005, а не к 2008. - person Holistic Developer; 15.11.2009