4

我编写了一个集成在 sql server 中的程序集,提供了一些用 C# 编写的存储过程。该程序集有一个只读静态变量,其中包含一些配置数据。该数据通过存储过程进行操作,这些存储过程也由程序集提供。显然我必须同步访问这个静态变量。我试着用

lock(someGuard)
{
    // ... access static configuration
}

在我的配置类里面。但后来我得到一个 HostProtectionException,告诉我,程序集必须以完全信任的方式运行才能做到这一点。有没有更好的方法来做到这一点?

4

2 回答 2

7

实际上有一个未记录的hack:用CompilerGenerated属性装饰类。与任何未记录的解决方法一样,里程可能会因未来版本而异。

你不应该需要这个,如果静态是只读的,那么你可以将它声明为只读并且程序集将很好地部署,只读静态在 SAFE 程序集中被接受。并且是真正的只读,锁保护也是不必要的。

如果您无法将其标记为只读并移除锁定,则意味着不是只读的,您将处于移动的沙子领域。您可以阻止 SQL 工作人员并产生不可预测的结果(因此是 UNSAFE 要求)。CompilerGenerated 技巧真的应该非常小心地使用除非你完全理解它的含义。您需要 a 的事实lock有力地表明您的代码实际上对 SQL 和静态不安全。

于 2009-08-16T17:23:23.370 回答
2

绕过此限制的唯一方法是将程序集部署为 UNSAFE。尽管如此,静态共享数据仍不符合建议:

SQL Server 中托管代码的编程模型需要不需要使用跨多个调用保持的状态或跨多个用户会话共享状态的函数、过程和类型。此外,如前所述,共享状态的存在可能会导致影响应用程序的可伸缩性和可靠性的严重异常。

鉴于这些考虑,SQL Server 不允许使用静态变量和静态数据成员。对于 SAFE 和 EXTERNAL-ACCESS 程序集,SQL Server 在 CREATE ASSEMBLY 时检查程序集的元数据,如果发现使用静态数据成员和变量,则无法创建此类程序集。

于 2009-08-16T16:28:51.550 回答