SQLCLR - упаковка COM-вызова

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

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

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

EDIT: код CLR, если он помогает:

[SqlProcedure]
public static void ArielComponentCall()
{
 Ariel.ApplicationClass application = new Ariel.ApplicationClass();
 object arielDoc = application.OpenDocument(@"P:\Projects\COAT\Ariel1.run");
}

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

1 ответ

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

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

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

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

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

licensed under cc by-sa 3.0 with attribution.