Sql Server CLR装载程序集失败。

14
我正在尝试部署CLR TVF(表值函数)。在我的代码中,我使用JavaScriptSerializer解析一些JSON字符串,因此我引用了System.Web.Extensions dll,这是我的问题所在。
项目构建成功,但当我尝试注册dll时,会收到以下错误:
程序集 'my_assembly_name' 引用了 程序集 'system.web.extensions, version=4.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35。' 该程序集在当前数据库中不存在。 SQL Server 试图从与引用程序集来自相同的位置定位并自动加载所引用的程序集,但该操作失败(原因:2 (系统找不到指定的文件) )。请将所引用的程序集加载到当前数据库中,然后重试请求。
我从以下位置引用了system.web.extensions:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Web.Extensions.dll
我可以设置复制加载为true或手动复制程序集,但然后引用错误会更深入 -
程序集 'my_assembly_name' 引用了 程序集 'system.servicemodel.activation, version=4.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35。' 该程序集在当前数据库中不存在。 SQL Server 试图从与引用程序集来自相同的位置定位并自动加载所引用的程序集,但该操作失败(原因:2 (系统找不到指定的文件) )。请将所引用的程序集加载到当前数据库中,然后重试请求。
除了引用Web.Extensions.dll外,一切都正常。目标框架是.NET 4。
有什么想法/解决方案吗?

SQL Server机器上是否安装了.NET 4框架? - Neil Knight
是的,正如我所说的那样,当未引用System.Web.Extensions.dll时,一切都运行良好。 - Klark
2个回答

16
根据文档,任何 .NET 程序集都可以被引用,但每个依赖程序集必须在数据库中进行注册(在 SQL Server Manager 中的"可编程性-程序集"节点中可见)。 一旦 SQL Server 数据库有了相关的程序集,它们将出现在 Visual Studio 的“添加引用”对话框窗口中。 下面的 SQL 代码有效。我需要 System.Web.dll 程序集(你需要正确版本的 2005 SQL 是 64 位)。
CREATE ASSEMBLY [System.Web] AUTHORIZATION dbo 
FROM 'c:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\System.web.dll'
WITH PERMISSION_SET = UNSAFE 
系统将尝试自动注册依赖项程序集,但只能从与您尝试注册的文件相同的目录中执行此操作。在我的情况下,它还为了使System.Web正常运行而在数据库中注册了以下程序集...
System.Configuration.Install    
System.Design   
System.DirectoryServices    
System.DirectoryServices.Protocols  
System.Drawing  
System.Drawing.Design   
System.EnterpriseServices   
System.Runtime.Remoting 
System.Runtime.Serialization.Formatters.Soap    
System.ServiceProcess   
System.Web.RegularExpressions   
System.Windows.Forms

我的系统使用的是3.5框架,所以我无法为您测试导入System.Web.Extensions.dll,但它可能需要来自另一个文件夹的其他程序集进行注册,因为它是一个4.0程序集,它可能引用了一些位于不同文件夹中的2.0或3.5程序集。

我怀疑您最终会得到一个相当庞大的程序集列表才能使其正常工作,但确实有可能做到。通过将所有相关的dll文件放在一个文件夹中并从那里进行注册,操作可能更容易完成。


4
很遗憾,.NET Framework CLR与SQL Server 2005/2008的集成只是该框架的有限子集,而System.Web.Extensions似乎不是受支持的程序集/命名空间。
要查看支持的程序集的完整列表,请参阅MSDN:http://msdn.microsoft.com/en-us/library/ms403279.aspx

非常遗憾。谢谢,我找到了一个不同的JSON解析器,这样问题就解决了。 - Klark
兴趣所在,解析器是什么,是Json.Net吗? - Kane
不是,我使用了 System.Web.Extensions.dll 中的 JavaScriptSerializer。 - Klark
@Klark,你最终使用了哪个解析器? - Edwin O.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接