【问题标题】:SQLCLR - Wrapping a COM callSQLCLR - 包装 COM 调用
【发布时间】:2011-06-29 16:50:11
【问题描述】:

我正在尝试调用一个 .net 程序集,该程序集包含来自 Sql Server 的一些 COM 调用(到第三方 dll)。程序集注册良好(我尝试使用不安全和外部访问进行注册),但是当我运行该程序时出现此错误:

在执行用户定义的例程或聚合“ManagedCodeCallTest”期间发生 .NET Framework 错误: System.UriFormatException:无效的 URI:URI 为空。 System.UriFormatException: 在 System.Uri.CreateThis(字符串 uri,布尔值 dontEscape,UriKind uriKind) 在 System.Uri..ctor(字符串 uriString) 在 System.ComponentModel.Design.RuntimeLicenseContext.GetLocalPath(字符串文件名) 在 System.ComponentModel.Design.RuntimeLicenseContext.GetSavedLicenseKey(类型类型,程序集 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 对象的引用。

【问题讨论】:

    标签: c# sql-server sqlclr


    【解决方案1】:

    SQL Server 上的 SqlClr 实现包含 a list 的“祝福”.net 汇编方法,这些方法将在 SQL Server 中工作。这是通过Host Protection Attributes 管理的。更准确地说

    SQL Server 不允许使用具有 指定 HostProtectionResource 值的 HostProtectionAttribute SharedState、Synchronization、MayLeakOnAbort 或 外部进程管理。这可以防止程序集调用成员 启用共享状态,执行同步,可能会导致 终止时资源泄漏,或影响 SQL 的完整性 服务器进程。

    根据程序集的“访问”设置,SQL Server 将抛出错误(当 SAFE 时),或者对被阻止的方法(UNSAFEEXTERNAL ACCESS)不执行任何操作。

    不幸的是,System.ComponentModel.LicenseContext 类具有 SharedState 主机保护属性,并且是不允许的代码的一部分。因此,在您的代码中的某处调用了 LicenseManager 中的方法,该方法将默默地不执行任何操作。

    无论哪种方式,在 SQL Server 进程中运行 com 组件都不是一个好主意,因为 com 组件崩溃会导致整个 SQL Server 崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2017-11-06
      • 2012-04-27
      • 1970-01-01
      • 2013-10-21
      相关资源
      最近更新 更多