Не удалось создать сборку System.ServiceModel.Internals в SQL

Я пытаюсь создать сборку на SQL, но не могу загрузить следующую библиотеку DLL.

System.ServiceModel.Internals

create assembly [system.servicemodel.internals]
from 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.ServiceModel.Internals.dll'
with permission_set = safe;
go

Я получаю такую ​​ошибку:

Msg 6218, уровень 16, состояние 2, строка 2 CREATE ASSEMBLY для сборки «System.ServiceModel.Internals» не удалось из-за сбоя проверки сборки «System.ServiceModel.Internals». Убедитесь, что сборки, на которые есть ссылка, являются актуальными и надежными (для external_access или небезопасно) для выполнения в базе данных. Сообщения об ошибках CLR Verifier, если таковые будут, будут следовать за этим сообщением [: System.Runtime.IOThreadScheduler + ScheduledOverlapped ::. Ctor] [mdToken = 0x6000185] [смещение 0x00000023] [обнаружен неуправляемый указатель] [ожидаемый неуправляемый указатель] Неожиданный тип в стеке. [: System.Runtime.IOThreadScheduler + ScheduledOverlapped :: Post] [mdToken = 0x6000183] [смещение 0x0000000D] [обнаружен неуправляемый указатель] [ожидаемый неуправляемый указатель] Неожиданный тип в стеке. [: System.Runtime.IOThreadScheduler + ScheduledOverlapped :: Cleanup] [mdToken = 0x6000184] [смещение 0x00000019] [обнаружен неуправляемый указатель] [ожидаемый неуправляемый указатель] Неожиданный тип в стеке. [: System.Runtime.Diagnostics.DiagnosticsEventProvider :: WriteMessageEvent] [mdToken = 0x6000357] [смещение 0x0000004B] [найдено ref 'System.String'] Ожидаемый числовой тип в стеке. [: System.Runtime.Diagnostics.DiagnosticsEventProvider :: WriteEvent] [mdToken = 0x6000359] [смещение 0x0000012B] Невозможно проверить инструкцию. [: System.Runtime.Diagnostics.DiagnosticsEventProvider :: WriteEvent] [mdToken = 0x6000359] [смещение 0x0000003F] Невозможно проверить инструкцию. [: System.Runtime.Diagnostics.DiagnosticsEventProvider :: WriteEvent] [mdToken = 0x600035a] [смещение 0x00000061] [найдено ref 'System.String'] Ожидаемый числовой тип в стеке. [: System.Runtime.Diagnostics.DiagnosticsEventProvider :: WriteEvent] [mdToken = 0x600035b] [смещение 0x0000001F] [обнаружен неуправляемый указатель] [ожидаемый неуправляемый указатель] Неожиданный тип в стеке. [: System.Runtime.Diagnostics.DiagnosticsEventProvider :: WriteTransferEvent] [mdToken = 0x600035c] [смещение 0x0000007C] Невозможно проверить инструкцию. [: System.Runtime.Diagnostics.DiagnosticsEventProvider :: WriteTransferEvent] [mdToken = 0x600035c] [смещение 0x000002F4] [найдено Native Int] [ожидаемый неуправляемый указатель] Неожиданный тип в стеке. [...

Я видел этот решенный вопрос (почти на 100% похожий) Не удалось СОЗДАТЬ СБОРКУ в SQL, поэтому я попытался сделать то же самое

Версия SQL Server для .NET и файл совпадают v4.0.30319

введите описание изображения здесь

Я выполнил инструкцию select * from sys.dm_clr_properties, и результат кажется нормальным.

directory   C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
version v4.0.30319
state   CLR is initialized

ВЕРСИЯ SQL: 11.2.5058.0

Есть идеи, как создать эту сборку?

Мне это нужно, потому что когда я пытаюсь создать кастомную сборку, я получаю такую ​​ошибку:

Assembly 'DataLoader' references assembly 'system.servicemodel.internals, version=4.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: 2(The system cannot find the file specified.)). Please load the referenced assembly into the current database and retry your request.


person blfuentes    schedule 07.01.2015    source источник
comment
blacai удачи с этим? Я столкнулся с той же проблемой   -  person jaxxbo    schedule 01.02.2015
comment
на данный момент из-за загруженности я не могу протестировать предоставленное решение. Если вы подтвердите, что это работает, я помечу как ответ   -  person blfuentes    schedule 03.02.2015
comment
@blacai Я могу подтвердить, что ответ Дэвида Мэннинга правильный: просто нужно использовать PERMISSION_SET из UNSAFE вместо SAFE. Конечно, я запускаю SQL Server 2012, скопировал ваш код CREATE ASSEMBLY из приведенного выше, запустил его, получил ошибку, изменил SAFE на UNSAFE, запустил снова, и все заработало.   -  person Solomon Rutzky    schedule 03.05.2015


Ответы (2)


Вы пробовали установить сборку с параметром набора разрешений UNSAFE?

У меня есть System.ServiceModel.Internals (v4 от GAC), установленный на SQL Server 11.0.5058 как UNSAFE, я не знаю, будут ли у вас проблемы с версией, но я считаю, что сборка может быть установлена ​​только как небезопасная, насколько это возможно доступ к неуправляемым ресурсам.

Из вашего сообщения об ошибке:

[обнаружен неуправляемый указатель] [ожидаемый неуправляемый указатель] Неожиданный тип в стеке.

Я понимаю это как ожидаемый неуправляемый указатель, обнаруженный неуправляемый указатель, неуправляемый указатель недопустим.

См. https://msdn.microsoft.com/en-us/library/ms189566.aspx для определения наборов разрешений.

person Dave Manning    schedule 04.02.2015
comment
Это была проблема с версией. Используя everything.exe, я искал все system.servicemodel.internals.dll, а затем выбрал dll, которая соответствовала clr-версии sql-сервера, и да, она должна была быть помечена как UNSAFE. - person jaxxbo; 05.02.2015

  [found ref 'System.String'] Expected numeric type on the stack

Трассировка стека говорит об этом, верификатор CLR проверил стек и обнаружил неожиданный тип, строку вместо числа. Это очень плохо. Соответствующий выполняемый метод, трассировка стека не завершена, поэтому мы не можем отследить его полностью назад, - это System.Runtime.Diagnostics.DiagnosticsEventProvider.WriteTransferEvent ().

Это дополнение .NET 4 к .NET Framework, оно поддерживает ETW (отслеживание событий для Windows). Дизассемблер может показать, какой код его использует, через несколько уровней, которые, например, вызывает System.ServiceModel.Channels.HttpRequestContext.TraceHttpMessageReceived ().

Другими словами, мы твердо находимся на земле WCF, он получил сообщение по HTTP и генерирует событие ETW, чтобы его можно было отследить с помощью инструментов ETW. Вызов возник в System.ServiceModel.dll, основной сборке WCF, код трассировки ETW находится в System.ServiceModel.Internals.dll.

Итак, каким-то образом, и это становится своего рода предрешенным выводом, как это могло произойти, учитывая характер вопроса, машина SQL Server имеет две разные версии этих сборок WCF. Они обычно распространяются в виде пары, как часть базовой установки .NET. После .NET 4.0 RTM было внесено много изменений, версии 4.01, 4.02, 4.03 передавались через Центр обновления Windows, например, эти обновления, в частности, затронули System.ServiceModel. Не говоря уже о версиях 4.5, 4.5.1, 4.5.2 и 4.6, выпущенных с тех пор, и нескольких нескольких обновлениях KB, которые исправляли ошибки и исправляли проблемы безопасности.

Предвидя следующий вопрос: так какая же версия System.ServiceModel.Internals.dll правильная? Вы можете позвонить в службу поддержки Microsoft, и они вам скажут: «нет ни одного». Но вы это уже знали. Так что не делай этого. Если вы все равно хотите попытаться заставить это работать, то основная стратегия состоит в том, чтобы сначала посмотреть номер версии System.ServiceModel, а затем попытаться найти System.ServiceModel.Internals, номер версии которого равен, если не равны, то по крайней мере приблизительно. Тот, который у вас есть сейчас, почти наверняка не близок, ревизия 34234 - это, грубо говоря, номер ревизии .NET 4.5.2.

person Community    schedule 01.02.2015