เกิดข้อผิดพลาดเมื่อคุณใช้เป็นวัตถุรันไทม์ของภาษาที่พบโดยทั่วไปใน SQL Server 2005: "ไม่สามารถโหลดแอสเซมบลี serialization ที่สร้างขึ้นแบบไดนามิกได้"

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 913668 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
bug #: 101935 (SQLBUDT)
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

อาการ

เมื่อคุณใช้วัตถุที่ใช้งานจริง (CLR) เป็นภาษาทั่วไปใน Microsoft SQL Server 2005 คุณอาจได้รับข้อความแสดงข้อผิดพลาดที่คล้ายกับข้อความต่อไปนี้:
msg 6522 ระดับ 16 สถานะ 2 บรรทัด 1
.NET Framework มีข้อผิดพลาดเกิดขึ้นในระหว่างการดำเนินการชุดคำสั่งของผู้ใช้ที่กำหนดหรือการรวม 'ObjectName':
System.InvalidOperationException: ไม่สามารถโหลดแอสเซมบลี serialization ที่สร้างขึ้นแบบไดนามิก ในบางแอสเซมบลีที่ระบบจัดการโฮสต์สำหรับ การโหลดฟังก์ชันถูกจำกัด ให้ลองใช้ตัว pre-generated โปรดดูข้อยกเว้น inner สำหรับข้อมูลเพิ่มเติม ---> 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 (xmlMappings [] XmlMapping ชนิด[]ชนิด defaultNamespace สตริงการ หลักฐานหลักฐาน พารามิเตอร์ CompilerParameters แอสเซมบลีของแอสเซมบลี แอสเซมบลี Hashtable)
เมื่อ System.Xml.Serialization.TempAssemblyctor (xmlMappings [] XmlMapping ชนิด[]ชนิด defaultNamespace สตริงการ สตริงการตั้ง หลักฐานหลักฐาน)
เมื่อ System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping xmlMapping ชนิดชนิด defaultNamespace สตริงการ)
เมื่อ System.Xml.Serialization.XmlSerializerctor (ชนิดของชนิด String defaultNamespace)
เมื่อ System.Xml.Serialization.XmlSe ...
ตัวอย่างเช่น คุณอาจได้รับข้อความข้อผิดพลาดเมื่อคุณใช้เป็นวัตถุ CLR ที่เรียกใช้บริการเว็บ หรือทำการแปลงจากชนิดของผู้ใช้กำหนด XML ภายใน SQL Server

สาเหตุ

ปัญหานี้เกิดขึ้นเมื่อวัตถุแบบ CLR ถูกแปลงเป็น XML ชนิดข้อมูล เมื่อการแปลงนี้เกิด มูลฐานการสื่อสารของ Windows (formerly code-named "Indigo") พยายามดำเนินการต่อไปนี้:
  • สร้างแอสเซมบลี serialization XML ใหม่
  • บันทึกแอสเซมบลีลงดิสก์
  • โหลดแอสเซมบลีในโดเมนปัจจุบันของแอพลิเคชัน
อย่างไรก็ตาม SQL Server ไม่อนุญาตสำหรับชนิดของการเข้าถึงดิสก์ใน CLR SQL เหตุผลด้านความปลอดภัยนี้ ดังนั้น คุณได้รับข้อความแสดงข้อผิดพลาดที่กล่าวไว้ในส่วน "อาการ" สถานการณ์ต่าง ๆ อาจทำให้วัตถุ CLR เพื่อที่ถูกแปลงเป็นชนิดข้อมูล XML

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับมูลฐานการสื่อสารของ Windows แวะไปที่เว็บไซต์ของ Microsoft สำหรับนักพัฒนาเครือข่าย (MSDN) ต่อไปนี้:
http://msdn2.microsoft.com/en-us/library/ms735119.aspx
คุณอาจได้รับข้อความแสดงข้อความแสดงข้อผิดพลาดที่กล่าวไว้ในส่วน "อาการ" ในสถานการณ์ต่อไปนี้:
  • รหัส CLR ที่ใช้ CLR วัตถุใช้ได้XmlSerializerคลาสที่ วัตถุ CLR เหล่านี้อาจรวมถึงวิธีการที่เก็บไว้ ฟังก์ชัน ชนิดที่กำหนดโดยผู้ใช้ aggregates และทริกเกอร์
  • คุณสามารถใช้บริการเว็บในรหัส CLR
  • คุณส่ง หรือรับวัตถุ CLR ไปยัง หรือ จาก SQL Server โดยใช้การเข้าถึง HTTP/SOAP โดยตรงไปยังเซิร์ฟเวอร์ SQL
  • วัตถุ CLR แปลงชนิดที่กำหนดโดยผู้ใช้ตามชนิดของข้อมูล XML

การแก้ไข

เมื่อต้องการแก้ไขปัญหานี้ คุณต้องใช้เครื่องมือตัวสร้างตัว XML (Sgen.exe) เพื่อสร้างแอสเซมบลี serialization 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();
        }

    }
}
เมื่อคุณเรียกใช้การXMLTestฟังก์ชันใน SQL Server Studio จัดการ ที่คุณคาดว่าจะได้รับผลลัพธ์ต่อไปนี้:
<?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 แอสเซมบลี serialization สำหรับแอสเซมบลีเดิม ใช้วิธีการต่อไปนี้อย่างใดอย่างหนึ่งในการสร้างแอสเซมบลี serialization ด้วยตนเอง

หมายเหตุ:วิธีการเหล่านี้อนุมานว่า เงื่อนไขต่อไปนี้เป็นจริง:
  • คุณได้สร้างคำdbTestฐานข้อมูลในอินสแตนซ์ของ SQL Server 2005
  • แฟ้มโครงการทั้งหมดจะถูกบันทึกใน C:\CLRTest ในโฟลเดอร์

วิธีที่ 1: สร้างโครงการ SQL Server CLR โดยใช้ Microsoft Visual Studio 2005

คุณสามารถสร้างแอสเซมบลี serialization โดยใช้การสร้างเหตุการณ์ตัวเลือกใน Microsoft Visual Studio 2005 โดยให้ทำตามขั้นตอนต่อไปนี้::
  1. เริ่ม Visual Studio 2005
  2. สร้างโครงการใหม่ของ sql server ที่ชื่อ MyTest
  3. ในการเพิ่มการอ้างอิงฐานข้อมูลกล่องโต้ตอบกล่อง คลิกการอ้างอิงที่เชื่อมต่อไปนี้dbTestฐานข้อมูล แล้วคลิกตกลง.

    ถ้าการอ้างอิงไม่อยู่ในรายการ คุณต้องสร้างการอ้างอิงใหม่ เมื่อต้องการทำเช่นนี้ คลิกเพิ่มการอ้างอิงใหม่.
  4. ในการProjectเมนู คลิกเพิ่มฟังก์ชันที่ผู้ใช้กำหนดเอง. กระบวนการเพิ่มรายการใหม่กล่องโต้ตอบปรากฏขึ้น
  5. คลิกaddเมื่อต้องการเพิ่มแฟ้มใหม่ โดยค่าเริ่มต้น แฟ้มเป็นชื่อ Function1.cs

    หมายเหตุ:คุณได้รับข้อความแสดงข้อความแสดงข้อผิดพลาดที่กล่าวไว้ใน "อาการ" ส่วนถ้าคุณปรับใช้โครงการกับฐานข้อมูล และเรียกใช้คำสั่ง Transact SQL ต่อไปนี้:
    SELECT [dbTest].[dbo].[XMLTest] ()
    คุณต้องทำตามขั้นตอนที่ 6-16 เพื่อแก้ไขปัญหานี้
  6. เพิ่มรหัสที่แสดงไว้ในส่วน "ตัวอย่างรหัส" ไปยังแฟ้ม Function1.cs
  7. ในการProjectเมนู คลิกMyTest คุณสมบัติ.
  8. ในการMyTestกล่องโต้ตอบ คลิกการBuild Eventsตัวเลือก
  9. พิมพ์คำสั่งต่อไปนี้ในการPost-build event command lineกล่อง:
    "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" /force "$(TargetPath)"
    หมายเหตุ:กระบวนการ/forceoption generates a new serialization assembly every time that you modify the source assembly. Additionally, you must modify this command if you installed Visual Studio 2005 in another folder.
  10. In the C:\CLRTest folder, create two text files that are named Predeployscript.sql and Postdeployscript.sql.
  11. Add the following Transact-SQL statements to the Predeployscript.sql file:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    	DROP ASSEMBLY [MyTest.XmlSerializers]
    
  12. Add the following Transact-SQL statements to the Postdeployscript.sql file:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
    
  13. ในการProjectเมนู คลิกAdd Existing Item.
  14. ในการAdd Existing Itemdialog box, locate the C:\CLRTest folder, and then clickAll Files (*.*)ในการชนิดแฟ้มรายการ
  15. ในการชื่อแฟ้มกล่อง ชนิดPostdeployscript.sql;Predeployscript.sqlแล้ว คลิกตกลง.
  16. ในการการสร้างเมนู คลิกDeploy MyTest.
  17. Run the following Transact-SQL statement in SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    You receive the correct result.

Method 2: Build a SQL CLR project at the Visual Studio Command Prompt window

  1. Locate the C:\CLRTest folder.
  2. Create a text file that is named MyTest.cs.
  3. Add the code that is listed in the "Code example" section to the MyTest.cs file.
  4. Open the Visual Studio 2005 Command Prompt window.
  5. ประเภท:CD C:\CLRTestแล้ว กด ENTER
  6. ประเภท:csc /t:library MyTest.csแล้ว กด ENTER
  7. ประเภท:sgen.exe /force MyTest.dllแล้ว กด ENTER
  8. การเรียกใช้คำสั่ง Transact SQL ต่อไปนี้ใน SQL Server Management 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
  9. การเรียกใช้คำสั่ง Transact SQL ต่อไปนี้ใน SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    คุณได้รับผลลัพธ์ที่ถูกต้อง

ถ้าคุณใช้แอสเซมบลีหลักที่อ้างอิงแอสเซมบลีอื่น คุณต้องสร้างแอสเซมบลี serialization XML สำหรับแอสเซมบลีทั้งหมดที่อ้างถึง โดยแอสเซมบลีหลัก แล้ว คุณต้องโหลดแอสเซมบลี serialization XML เหล่านี้ลงในฐานข้อมูล SQL Server โดยใช้คำสั่งสร้างแอสเซมบลี

สถานะ

ลักษณะการทำงานนี้เกิดจากการออกแบบ

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ XML serialization จาก CLR วัตถุฐานข้อมูล MSDN เว็บไซต์ต่อไปนี้:
http://msdn2.microsoft.com/en-us/library/ms131088.aspx
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเครื่องมือตัวสร้างตัว XML ไปที่ MSDN เว็บไซต์ต่อไปนี้:
http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx

คุณสมบัติ

หมายเลขบทความ (Article ID): 913668 - รีวิวครั้งสุดท้าย: 16 มกราคม 2554 - Revision: 2.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
Keywords: 
kbsql2005clr kbexpertiseadvanced kbprb kbmt KB913668 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:913668

ให้ข้อเสนอแนะ

 

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