У меня есть обширная библиотека функций C / C ++, которую нужно вызывать из SQL Server 2008.
Я написал класс адаптера C #, который загружает эти функции из Win32 DLL с DllImport
и предоставляет их .Net-коду. Это прекрасно работает в большинстве приложений .Net.
Теперь я пытался использовать ту же технику с SQL Server CLR. Я создаю набор функций CLR и хранимых процедур, которые вызывают класс адаптера. Это не работает, поскольку попытка загрузить неуправляемую DLL приводит к System.BadImageFormatException
.
Я могу сделать это с помощью расширенных хранимых процедур, но этот метод устарел и может быть прекращен в любом новом выпуске SQL Server.
Каков будет правильный способ вызова неуправляемых функций из хранимой процедуры CLR? Я думаю, что это должно быть сделано вне процесса.
Я пытаюсь заставить мой хранимый процесс вызывать веб-сервис, который предоставляет эти функции. Это звучит как хорошая идея, но до сих пор у меня возникают проблемы с развертыванием сборки SQLCLR, которая выполняет вызов веб-службы. Я не могу загрузить System.ServiceModel.dll
сборку version=3.0.0.0
, которая зависит от System.Web.dll
версии сборки 2.0.0.0
.
Загрузка System.Web
сборка выдает мне следующую ошибку:
Сборка 'System.Web' ссылается на сборку 'system.web, версия = 2.0.0.0, культура = нейтральная, publickeytoken = b03f5f7f11d50a3a.', Которой нет в текущей базе данных. SQL Server попытался найти и автоматически загрузить указанную сборку из того же места, откуда пришла ссылающаяся сборка, но эта операция завершилась неудачно (причина: несовпадение версии, языка или открытого ключа). Загрузите указанную сборку в текущую базу данных и повторите ваш запрос.
Я нашел решение проблемы развертывания System.Web
сборки. Вместо того, чтобы развертывать его с C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll
, его следует развертывать с C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll
. Затем будут развернуты все остальные необходимые сборки.
Список сборок в порядке развертывания:
- C: \ Windows \ Microsoft.NET \ Framework \ v3.0 \ Windows Communication Foundation \ SMdiagnostics.dll
- C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ System.Web.dll
- C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ System.Messaging.dll
- C: \ Program Files \ Справочные сборки \ Microsoft \ Framework \ v3.0 \ System.IdentityModel.dll
- C: \ Program Files \ Справочные сборки \ Microsoft \ Framework \ v3.0 \ System.IdentityModel.Selectors.dll
- C: \ Windows \ Microsoft.NET \ Framework \ v3.0 \ Windows Communication Foundation \ Microsoft.Transactions.Bridge.dll