我编写了一个集成在sql server中的程序集,提供了一些用C#编写的存储过程。该程序集具有一个只读静态变量,用于保存一些配置数据。该数据通过存储过程进行操作,存储过程也由程序集提供。显然我必须同步访问这个静态变量。我试着用
lock(someGuard)
{
// ... access static configuration
}
在我的配置类中。但后来我得到一个HostProtectionException,告诉我,程序集必须以完全信任的方式运行才能做到这一点。有没有更好的方法呢?
答案 0 :(得分:7)
实际上有一个未记录的hack:使用CompilerGenerated
属性装饰该类。与任何未记录的变通方法一样,里程可能会随着将来的版本而变化。
你不应该需要这个,如果静态是只读的那么你可以只读它并且程序集将部署正常,在SAFE程序集中接受只读静态。并且真正只读,锁定防护也是不必要的。
如果您无法将其标记为只读并取消锁定,则表示不是只读,并且您将在移动沙地区域。您可以阻止SQL工作程序并具有不可预测的结果(因此符合UNSAFE要求)。如果您完全理解其含义,那么CompilerGenerated技巧应该与很多小心,onyl一起使用。您需要lock
的事实强烈表明您的代码实际上对SQL和静态不安全。
答案 1 :(得分:2)
解决此限制的唯一方法是将程序集部署为UNSAFE。不过,静态共享数据仍然违反建议:
托管代码的编程模型 在SQL Server中需要函数, 程序,以及没有的程序 要求使用跨越国家 多次调用或共享 跨多个用户会话的状态。 此外,如前所述, 共享状态的存在可能导致 重要的例外情况会影响到 可扩展性和可靠性 应用。
考虑到这些注意事项,SQL Server 不允许使用静态变量 和静态数据成员。对于SAFE和 外部访问程序集,SQL Server 检查程序集的元数据 在CREATE ASSEMBLY时间,并失败了 如果是这样的话,就创造出 找到静态数据成员的使用 和变量。