SQLCLR - Завершение COM-вызова - PullRequest
4 голосов
/ 29 июня 2011

Я пытаюсь вызвать сборку .net, которая оборачивает несколько COM-вызовов (сторонним dll) с Sql Server. Сборка регистрируется нормально (я пытался зарегистрироваться с небезопасным и внешним доступом), но когда я запускаю процедуру, я получаю эту ошибку:

Ошибка .NET Framework произошла во время выполнения пользовательской подпрограммы или агрегата "ManagedCodeCallTest": System.UriFormatException: неверный URI: URI пуст. System.UriFormatException: в System.Uri.CreateThis (строка URI, логическое значение dontEscape, UriKind uriKind) в System.Uri..ctor (String uriString) в System.ComponentModel.Design.RuntimeLicenseContext.GetLocalPath (String fileName) в System.ComponentModel.Design.RuntimeLicenseContext.GetSavedLicenseKey (тип Type, сборка resourceAssembly) в System.ComponentModel.LicenseManager.LicenseInteropHelper.GetCurrentContextInfo (Int32 & fDesignTime, IntPtr & bstrKey, RuntimeTypeHandle rth) в ManagedCode.MyClass.ArielComponentCall ()

Есть идеи? Что я пытаюсь сделать, даже возможно? Я читал кое-что о лицензированных dll, но информация была очень расплывчатой.

РЕДАКТИРОВАТЬ: код CLR, если это помогает:

[SqlProcedure]
public static void ArielComponentCall()
{
    Ariel.ApplicationClass application = new Ariel.ApplicationClass();

    object arielDoc = application.OpenDocument(@"P:\Projects\COAT\Ariel1.run");
}

Проект, который содержит этот класс, имеет ссылку на объект com.

1 Ответ

2 голосов
/ 25 октября 2012

Реализация SqlClr на SQL Server содержит список"благословенных" методов сборки .net, которые будут работать в SQL Server. Это осуществляется через Атрибуты защиты хоста . Точнее

SQL Server запрещает использование типа или члена, который имеет HostProtectionAttribute, который указывает значение HostProtectionResource SharedState, Синхронизация, MayLeakOnAbort или ExternalProcessMgmt. Это предотвращает сборку от вызова членов которые включают состояние общего доступа, выполняют синхронизацию, могут вызвать утечка ресурсов при завершении или повлиять на целостность SQL Серверный процесс.

В зависимости от настроек «Доступ» вашей сборки SQL Server выдаст сообщение об ошибке (когда SAFE) или ничего не сделает с заблокированным методом (UNSAFE и EXTERNAL ACCESS).

К сожалению для вас, класс System.ComponentModel.LicenseContext имеет атрибут защиты хоста SharedState и является частью кода, который не разрешен. Как следствие, где-то в вашем коде происходит вызов метода в LicenseManager, который ничего не делает.

В любом случае, запуск компонентов com в процессе SQL Server не является хорошей идеей, поскольку сбой компонента com приведет к сбою всего SQL Server.

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