2009-10-29 69 views
4

在SQL Server 2008上,我试图注册一个似乎只能引用supported libraries的程序集。下面是我使用注册程序集的T-SQL代码:为什么SQL Server不能将我的程序集注册为SAFE?

create assembly MySpatial from 'c:\Spatial.dll' 

这将导致以下错误:

Msg 6509, Level 16, State 31, Line 1 An error occurred while gathering metadata from assembly 'Spatial' with HRESULT 0x80004005.

不过,如果我添加with permission_set=unsafe,那么SQL将执行命令成功。我怎样才能找出错误发生的原因,或为什么我的程序集必须注册为不安全?

+0

我与我的程序集有完全相同的问题。没有任何非''readonly'静态字段/属性,它只引用了安全的'mscorlib.dll'和'System.dll',都是v2。我试图将有限的一部分类复制到一个单独的文件中,并进行编译,这是有效的,所以有一些特定的东西阻止它被接受为安全的。 – 2010-01-28 12:54:36

+0

我发现我的程序集有问题,它在'GetEnumerator()'方法中有一些lambda表达式,所以我将它们转换为常规方法+'new Func <>'(将它们转换为匿名方法并没有帮助) 。这使我可以将程序集添加到SQL Server而不会出现错误。我仍然不清楚为什么这些lambda表达式导致了这种情况(它们可以在SQL Server之外编译和运行)。 – 2010-01-28 14:19:15

回答

1

当设置的权限不安全时,SQL将不会验证您的程序集的元数据。

尝试应用KB 941256的修补程序或应用CU4 for SP2。 Altough与您得到的E_FAIL不同,HRESULT可能是修复程序解决此问题的方法。

+0

当然,据我所知,当权限设置为不安全时,SQL只会让它通过。但是,我试图找出我的组件是不是被认为是安全的? 另外,您提供的链接仅适用于SQL Server 2005,不适用于2008。 – 2009-11-15 05:28:20

2

我遇到了同样的情况,经过一番调查,我认为这是因为编译器对lambda表达式进行了优化。从lambda表达式创建委托有一些开销。我认为在第一次访问lambda时,它必须懒惰地初始化一个包含委托的隐藏静态字段,以便在将来的调用中重用已经构建的委托。

我认为这是因为如果lambda捕获任何变量,它不会导致安全问题。这是有道理的,如果它捕获变量,每次调用它时都需要创建一个不同的委托,但是如果lambda是完全独立的,那么为了提高效率,它可以缓存它。

Microsoft确实在SQL 2008中修复了这个问题,但他们不会在SQL 2005中修复它,所以如果需要支持现有的SQL 2005安装,它只需要消除“静态优化”lambdas,而不是所有的在整个集会中的lambda。

相关问题