Sql server 为什么赢了';SQL Server是否将我的程序集注册为安全程序集?

Sql server 为什么赢了';SQL Server是否将我的程序集注册为安全程序集?,sql-server,sqlclr,Sql Server,Sqlclr,在SQLServer2008上,我试图注册一个似乎只引用。下面是我用来注册程序集的T-SQL代码: create assembly MySpatial from 'c:\Spatial.dll' 这将导致以下错误: Msg 6509,第16级,第31状态,第1行 收集数据时出错 来自具有的程序集“Spatial”的元数据 HRESULT 0x80004005 但是,如果我添加了且权限设置为不安全,那么SQL将成功执行该命令。如何找出发生错误的原因,或者为什么我的程序集必须注册为不安全程序集?当

在SQLServer2008上,我试图注册一个似乎只引用。下面是我用来注册程序集的T-SQL代码:

create assembly MySpatial from 'c:\Spatial.dll'
这将导致以下错误:

Msg 6509,第16级,第31状态,第1行 收集数据时出错 来自具有的程序集“Spatial”的元数据 HRESULT 0x80004005


但是,如果我添加了
且权限设置为不安全
,那么SQL将成功执行该命令。如何找出发生错误的原因,或者为什么我的程序集必须注册为不安全程序集?

当任务集不安全时,SQL不会验证程序集的元数据


尝试从应用修补程序,或应用。虽然与您得到的
E_FAIL
不同,但可能热修复程序解决了这个问题。

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

我认为这是因为如果lambda捕获任何变量,它不会导致安全问题。如果它捕获变量,每次调用时都需要创建不同的委托,这是有意义的,但是如果lambda是完全自包含的,它可以缓存它以提高效率


微软确实在SQL 2008中解决了这个问题,但他们不会在SQL 2005中解决这个问题,因此如果需要支持现有的SQL 2005安装,它所需要的只是消除“静态优化”的lambda,而不是整个程序集中的所有lambda。

当然,我知道当权限设置为不安全时,SQL只会让它通过。但是,我正在试图找出我的程序集有什么不安全的地方?另外,您提供的链接仅适用于SQL Server 2005,而不是2008。我的程序集也存在同样的问题。没有任何非只读静态字段/属性,它只引用了safe
mscorlib.dll
System.dll
,都是v2。我尝试将类的有限部分复制到一个单独的文件中并编译,这是可行的,因此有一些特定的东西阻止它被认为是安全的。我发现我的程序集存在问题,它在
GetEnumerator()
方法中有一些lambda表达式,所以我将它们转换为常规方法+
new Func
(将它们转换为匿名方法没有帮助)。这使我能够将程序集添加到SQL Server而不会出现错误。我仍然不知道这些lambda表达式导致这种情况的确切原因(它们可以在SQL Server之外编译并运行良好)。