在使用 SQL Server 2005 中的公共语言运行时对象时出现错误消息:"无法加载动态生成的序列化程序集"

文章翻译 文章翻译
文章编号: 913668 - 查看本文应用于的产品
Bug #: 101935 (SQLBUDT)
展开全部 | 关闭全部

本文内容

症状

当您在 Microsoft SQL Server 2005 年使用公共语言运行时 (CLR) 对象时,可能会收到类似于以下错误消息:
消息 6522,级别 16,状态 2,第 1 行
.NET Framework 错误出现在过程中执行用户定义的例程或聚合的对象名称:
System.InvalidOperationException: 无法加载动态生成的序列化程序集。一些宿主环境程序集中加载功能受到限制,请考虑使用预生成的序列化程序。请参阅内部异常的详细信息。---> System.IO.FileLoadException: LoadFrom()、 LoadFile()、 Load(byte[]) 和 LoadModule() 已被禁用的宿主。
System.IO.FileLoadException:
在 System.Reflection.Assembly.nLoadImage (字节 [] rawAssembly、 字节 [] rawSymbolStore、 证据证据、 StackCrawlMark & stackMark,布尔 fIntrospection)
在 System.Reflection.Assembly.Load (字节 [] rawAssembly、 字节 [] rawSymbolStore、 证据 securityEvidence)
在 Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters 选项的字符串 [] 文件名)
在 Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (CompilerParameters 选项的字符串 [] 源)
在 Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (CompilerParameters 选项的字符串 [] 源)
在 System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (CompilerParameters 选项,字符串 [] s
...
System.InvalidOperationException:
在 System.Xml.Serialization.Compiler.Compile (程序集父字符串 ns、 CompilerParameters 参数、 证据证据)
在 System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] xmlMappings、 键入 [] 类型、 字符串 defaultNamespace、 证据证据、 CompilerParameters 参数,程序集的程序集、 哈希表的程序集)
在 System.Xml.Serialization.TempAssembly.ctor (XmlMapping [] xmlMappings、 键入 [] 类型、 defaultNamespace 字符串、 字符串的位置、 证据证据)
在 System.Xml.Serialization.XmlSerializer.GenerateTempAssembly XmlMapping xmlMapping、 类型类型字符串 defaultNamespace)
在 System.Xml.Serialization.XmlSerializer.ctor (类型类型的字符串 defaultNamespace)
在 System.Xml.Serialization.XmlSe...
例如,可能会收到错误消息,当您使用 CLR 对象,它将调用 Web 服务或执行从用户定义的类型转换为在 SQL Server 内部的 XML。

原因

CLR 对象转换为 XML 数据类型时,会出现此问题。这种转换时,窗口通信基础 (以前称为代码名称为"Indigo") 尝试执行下列操作:
  • 生成新的 XML 序列化程序集。
  • 将程序集保存到磁盘中。
  • 将程序集加载到当前应用程序域。
但是,SQL Server 不允许这种类型的 SQL CLR 中出于安全原因的磁盘访问。因此,您会收到"症状"一节中提到的错误消息。几种情况可能会导致 CLR 对象要转换为 XML 数据类型。

有关窗口通信基础的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) Web 站点:
http://msdn2.microsoft.com/en-us/library/ms735119.aspx
您可能会收到在以下情况中"症状"一节中提到的错误消息:
  • 实现 CLR 的 CLR 代码显式对象使用 XmlSerializer 类。这些 CLR 对象可能包括存储的过程、 函数、 用户定义的类型、 聚合和触发器。
  • CLR 代码中,您使用的 Web 服务。
  • 您发送或接收到或从 SQL Server byusing 直接 HTTP/SOAP 访问 SQL Server 的 CLR 对象。
  • CLR 对象将转换为 XML 数据类型的用户定义的类型。

解决方案

若要解决此问题,您必须使用 XML 序列化程序生成器工具 (Sgen.exe) 来创建 XML 序列化程序集的原始程序集手动。然后,将程序集加载到 SQL Server 数据库中。

代码示例

例如,可能想要创建的 CLR 函数,使用下面的代码示例所创建的程序集返回的 XML 数据:
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();
        }

    }
}
当您在 SQL Server 管理 Studio 中调用XMLTest函数时,您应该收到以下结果:
<?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:\CLRTestfolder 中。

方法 1: 使用 Microsoft Visual Studio 2005年构建 SQL Server CLR 项目

您可以通过使用 Microsoft Visual Studio 2005年中的生成事件选项创建序列化程序集。若要执行此操作,请执行以下步骤:
  1. 开始 Visual Studio 2005。
  2. 创建一个新的 SQL Server 项目是 namedMyTest。
  3. 添加数据库引用对话框中,单击连接到dbTest数据库,引用,然后单击确定

    如果 thereference 不在列表中,则必须创建新的引用。要执行此操作,请单击添加新引用
  4. 项目菜单上,单击AddUser-Defined 函数添加新项对话框会出现。
  5. 单击添加以添加新的文件。默认情况下,该文件命名为 Function1.cs。

    注意您收到的错误消息,如果将项目部署到数据库,然后运行 followingTransact SQL 语句"症状"一节中提到:
    SELECT [dbTest].[dbo].[XMLTest] ()
    您必须执行步骤 6-16,若要解决此问题。
  6. 添加的代码,将列出在"代码示例"节要 Function1.cs 文件。
  7. 项目菜单上,单击MyTestProperties
  8. MyTest对话框中,单击生成事件选项。
  9. 后期生成 eventcommand 行框中,键入以下命令:
    "C:\Program 使用 Visual Studio 8\SDK\v2.0\Bin\sgen.exe"/force"$ (目标路径)"
    注意/Force选项生成新序列化程序集每次该修改源代码的程序集。此外,您必须修改此命令,如果安装 Visual Studio 2005 的另一个文件夹。
  10. 在 C:\CLRTest 文件夹中,将创建两个文本文件,arenamed Predeployscript.sql 和 Postdeployscript.sql。
  11. 将下面的事务处理性的 SQL 语句添加到 thePredeployscript.sql 文件:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    	DROP ASSEMBLY [MyTest.XmlSerializers]
    
  12. 将下面的事务处理性的 SQL 语句添加到 thePostdeployscript.sql 文件:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
    
  13. 项目菜单上,单击AddExisting 项目
  14. 添加现有项对话框中,找到 C:\CLRTest 文件夹,然后单击的所有文件 (*。 *)文件类型列表中。
  15. 文件名框中,键入Postdeployscript.sqlPredeployscript.sql然后单击确定
  16. 生成菜单中,单击DeployMyTest
  17. SQL ServerManagement Studio 中运行下面的事务处理性的 SQL 语句:
    SELECT [dbTest].[dbo].[XMLTest] ()
    您会收到正确的结果。

方法 2: 生成 SQL CLR 项目在 Visual Studio 的命令提示符窗口

  1. 定位到 C:\CLRTest 文件夹。
  2. 创建一个名为 MyTest.cs 的文本文件。
  3. 添加的代码,将列出在"代码示例"节要 MyTest.cs 文件。
  4. 打开 Visual Studio 2005年命令提示符窗口。
  5. 键入 CD C:\CLRTest,然后 pressENTER。
  6. 键入 csc MyTest.cs /t:library然后按 enter 键。
  7. 键入 sgen.exe MyTest.dll /force然后按 enter 键。
  8. SQL ServerManagement Studio 中运行下列事务处理性的 SQL 语句:
    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
  9. SQL ServerManagement Studio 中运行下面的事务处理性的 SQL 语句:
    SELECT [dbTest].[dbo].[XMLTest] ()
    您会收到正确的结果。

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

状态

这种现象是设计使然。

参考

从 CLR 数据库对象的 XML 序列化的更多信息,请访问下面的 MSDN 网站:
http://msdn2.microsoft.com/en-us/library/ms131088.aspx
有关 XML 序列化程序生成器工具的详细信息,请访问下面的 MSDN 网站:
http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx

属性

文章编号: 913668 - 最后修改: 2013年11月1日 - 修订: 4.0
这篇文章中的信息适用于:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL 2005 Server Workgroup
关键字:?
kbsql2005clr kbexpertiseadvanced kbprb kbmt KB913668 KbMtzh
机器翻译
重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。
点击这里察看该文章的英文版: 913668
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com