CLR无法加载动态生成的序列化程序集

来源:互联网 发布:美容网络推广 编辑:程序博客网 时间:2024/06/10 04:30


http://support.microsoft.com/kb/913668


当您使用 SQL Server 2005 中的一个公共语言运行库对象时出现错误消息: 无法加载动态生成的序列化程序集
点击这里查看逐句中英文对照机器翻译
查看机器翻译免责声明

查看本文应用于的产品
错误 #: 101935 (SQLBUDT)

本页症状
原因
解决方案
代码示例
方法 1: 通过使用 Microsoft Visual Studio 2005 生成 SQL Server CLR 项目
方法 2: 生成在 Visual Studio 命令提示窗口中的 SQL CLR 项目
状态
参考
症状当在 Microsoft SQL Server 2005 中使用一个公共语言运行库 (CLR) 对象时,您可能会收到与以下类似的错误消息: 消息 6522,级别...当在 Microsoft SQL Server 2005 中使用一个公共语言运行库 (CLR) 对象时,您可能会收到与以下类似的错误消息:
消息 6522,级别 16 状态 2,行 1
在执行用户定义的例程或聚合对象的过程中发生了.net 框架错误:
System.InvalidOperationException: 无法加载动态生成的序列化程序集。在某些宿主环境的程序集加载功能受到限制,请考虑使用预生成序列化程序。请参阅内部异常的详细信息。---> System.IO.FileLoadException: LoadFrom()、 LoadFile()、 Load(byte[]) 和 LoadModule() 已被禁用的宿主。
System.IO.FileLoadException:
在 System.Reflection.Assembly.nLoadImage (Byte [] rawAssembly、 Byte [] rawSymbolStore、 证据证据、 StackCrawlMark 和 stackMark,布尔 fIntrospection)
在 System.Reflection.Assembly.Load (Byte [] rawAssembly、 Byte [] rawSymbolStore,证据 securityEvidence)
在 Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch String [] 文件名中的 CompilerParameters 选项)
在 Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
在 Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
在 System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] s
...
System.InvalidOperationException:
在 System.Xml.Serialization.Compiler.Compile 组件父、 字符串 ns、 CompilerParameters 参数证据证据)
在 System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] xmlMappings、 类型 [] 类型、 字符串 defaultNamespace、 证据证据、 CompilerParameters 参数、 组件程序集,程序集哈希表)
在 System.Xml.Serialization.TempAssemblyctor XmlMapping [] xmlMappings、 类型 [] 类型、 字符串 defaultNamespace、 字符串的位置证据证据)
在 System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
在 System.Xml.Serialization.XmlSerializerctor(Type type, String defaultNamespace)
在 System.Xml.Serialization.XmlSe...
例如对于,使用一个 CLR 对象,该调用 Web 服务或执行从用户定义的类型到内部 SQL Server XML 转换对象时,您可能会收到错误消息。
回到顶端
原因当 CLR 对象转换为 XML 时,会发生此问题数据类型。当发生这种转换时,Windows 通讯基础 (以前称为 code-named"靛蓝色") 将尝试执行以...当 CLR 对象转换为 XML 时,会发生此问题数据类型。当发生这种转换时,Windows 通讯基础 (以前称为 code-named"靛蓝色") 将尝试执行以下操作:
生成新的 XML 序列化程序集。
将程序集保存到磁盘。
该程序集加载到当前应用程序域。
但是,SQL Server 不允许进行这种类型的 SQL CLR 中出于安全原因的磁盘访问。因此,您收到"症状"部分中提到的错误消息。几种情况可能会导致 CLR 对象来转换为 XML 数据类型。

有关 Windows 通讯基础的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:
http://msdn2.microsoft.com/en-us/library/ms735119.aspx (http://msdn2.microsoft.com/en-us/library/ms735119.aspx)
您可能会收到在以下情况下在"症状"一节中提到的错误消息:
显式实现 CLR 对象的 CLR 代码使用 XmlSerializer 类。存储的过程、 函数、 用户定义类型、 聚合,和触发器,可能包括这些 CLR 对象。
在 CLR 代码中使用的 Web 服务。
发送或接收 CLR 对象或从 SQL Server 通过使用直接 HTTP/SOAP SQL Server 访问。
CLR 对象将转换为 XML 数据类型的用户定义的类型。
回到顶端
解决方案若要解决此问题,您必须使用 XML 序列化程序生成器工具 (Sgen.exe) 创建 XML 序列化程序集的原始程序集手动。然后,将程序集加载到一个 SQL S...若要解决此问题,您必须使用 XML 序列化程序生成器工具 (Sgen.exe) 创建 XML 序列化程序集的原始程序集手动。然后,将程序集加载到一个 SQL Server 数据库。
回到顶端
代码示例
For example, you may want to create a CLR function that returns XML data by using an assembly that is created by the following code example:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;  
using System.Xml;
using System.Xml.Serialization;
using System.Text;
using System.IO;
public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static  SqlString XMLTest()
    {
        Person p = new Person();
        return new SqlString(p.GetXml());
       
    }
    public class Person
    {
        public String m_FirstName = "Jane";
        public String m_LastName = "Dow";

        public String GetXml()
        {
          XmlSerializer ser = new XmlSerializer(typeof(Person));
          StringBuilder sb = new StringBuilder();
          StringWriter wr = new StringWriter(sb);
            ser.Serialize(wr, this);

            return sb.ToString();
        }

    }
}


When you call the XMLTest function in SQL Server Management Studio, you expect to receive the following result:
<?xml version="1.0" encoding="utf-16"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m_FirstName>Jane</m_FirstName>
<m_LastName>Dow</m_LastName> 
</Person>

返回正确的结果,您必须手动创建 XML 序列化程序集的原始程序集。使用下列方法之一手动创建序列化程序集。

注意这些方法假定下列条件为真:
您已经创建了一个 dbTest 数据库 SQL Server 2005 的一个实例中。
所有项目文件都保存在该 C:\CLRTest 文件夹。
回到顶端
方法 1: 通过使用 Microsoft Visual Studio 2005 生成 SQL Server CLR 项目
可以通过使用 Microsoft Visual Studio 2005 中的 生成事件 选项来创建序列化程序集。若要这样做,请按照下列步骤操作:
启动 Visual Studio 2005。
创建一个新的 SQL Server 项目名为 MyTest 的。
添加数据库引用 对话框中单击连接到 dbTest 数据库的引用,然后单击 确定。

如果引用不是在列表中,您必须创建新的引用。若要执行此操作单击 添加新引用。
在 项目 菜单上单击 添加用户定义函数。在 添加新项 对话框。
单击 添加 以添加一个新的文件。默认状态下,该文件称为 Function1.cs。

注意您会收到错误消息提到"症状"部分,如果在将项目部署到数据库,然后运行下面的 TRANSACT-SQL 语句:
SELECT [dbTest].[dbo].[XMLTest] ()

您必须遵循的步骤 6-16 若要解决此问题。
添加到 Function1.cs 文件"代码示例"部分中列出的代码。
在 项目 菜单上单击 MyTest 属性。
在 MyTest 对话框上单击 生成事件 选项。
在 生成后事件命令行 框中键入以下命令:
"是 Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe"/ force"$ (TargetPath)"
注意/ 强制 选项将生成新的序列化程序集每次您修改源组件。此外,您必须修改此命令,如果您安装 Visual Studio 2005 的另一个文件夹中。
C:\CLRTest 文件夹中创建名为 Predeployscript.sql 和 Postdeployscript.sql 的两个文本文件。
将下面的 TRANSACT-SQL 语句添加到 Predeployscript.sql 文件:
IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers')
 DROP ASSEMBLY [MyTest.XmlSerializers]


将下面的 TRANSACT-SQL 语句添加到 Postdeployscript.sql 文件:
CREATE ASSEMBLY [MyTest.XmlSerializers] from
'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
WITH permission_set = SAFE


在 项目 菜单上单击 添加现有项。
在 添加现有项 对话框找到 C:\CLRTest 文件夹,然后单击 所有文件 (* *)文件类型 列表中。
在 文件名 框中键入 Postdeployscript.sql;Predeployscript.sql,然后单击 确定。
在 生成 菜单上单击 部署 MyTest。
运行下面的 TRANSACT-SQL 语句中 SQL Server 管理 Studio:
SELECT [dbTest].[dbo].[XMLTest] ()

收到正确的结果。
回到顶端
方法 2: 生成在 Visual Studio 命令提示窗口中的 SQL CLR 项目
找到 C:\CLRTest 文件夹。
创建一个名为 MyTest.cs 的文本文件。
添加到 MyTest.cs 文件"代码示例"部分中列出的代码。
打开 Visual Studio 2005 命令提示窗口中。
键入 CD C:\CLRTest,然后按 ENTER 键。
键入 csc /t:library MyTest.cs,然后按 ENTER 键。
键入 sgen.exe/force MyTest.dll,然后按 ENTER 键。
运行以下的 TRANSACT-SQL 语句,在 SQL Server 管理 Studio:
USE dbTest
GO
CREATE ASSEMBLY [MyTest] from 'C:\CLRTest\MyTest.dll'
GO
CREATE ASSEMBLY [MyTest.XmlSerializers.dll] from 'C:\CLRTest\MyTest.XmlSerializers.dll'
GO

CREATE FUNCTION XMLTest()
RETURNS nvarchar (max)
AS
EXTERNAL NAME MyTest.StoredProcedures.XMLTest
GO

运行下面的 TRANSACT-SQL 语句中 SQL Server 管理 Studio:
SELECT [dbTest].[dbo].[XMLTest] ()

收到正确的结果。

如果您使用其他程序集引用程序集是主程序集,您必须生成所有程序集引用的主程序集的 XML 序列化程序的集。然后,您必须通过使用 CREATE ASSEMBLY 语句 SQL Server 数据库中加载这些 XML 序列化程序集。

原创粉丝点击