當您在 SQL Server 2005 中使用通用語言執行階段物件時,出現錯誤訊息: 「 無法載入動態產生的序列化組件 」

文章翻譯 文章翻譯
文章編號: 913668 - 檢視此文章適用的產品。
Bug #: 101935 (SQLBUDT)
全部展開 | 全部摺疊

在此頁中

徵狀

當您在 Microsoft SQL Server 2005 中使用通用語言執行階段 (CLR) 物件時,可能會收到類似下列的錯誤訊息:
msg 6522,層級 16,狀態 2,行 1
執行的使用者自訂常式或彙總 'ObjectName' 時發生.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 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 (組件父、 String ns、 CompilerParameters 參數、 辨識項的辨識項)
在 System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] xmlMappings、 類型 [] 型別、 String defaultNamespace、 辨識項的辨識項、 CompilerParameters 參數、 組件的組件、 Hashtable 組件)
在 System.Xml.Serialization.TempAssemblyctor (XmlMapping [] xmlMappings、 型別 [] 型別、 字串 defaultNamespace、 字串位置、 辨識項的辨識項)
在 System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
在 System.Xml.Serialization.XmlSerializerctor (型別類型,字串 defaultNamespace)
在 System.Xml.Serialization.XmlSe...
例如您可能會收到錯誤訊息,當您使用 CLR 物件,呼叫 Web 服務或執行使用者定義型別轉換成 SQL Server 內部的 XML。

發生的原因

當 CLR 物件轉換成 XML 時,就會發生這個問題的資料型別。這種轉換發生時,Windows 通訊基礎 (先前稱為 「 靛藍") 會嘗試執行下列動作:
  • 產生新的 XML 序列化組件。
  • 將組件儲存至磁碟。
  • 到目前的應用程式定義域載入組件。
但是,SQL Server 不允許這種磁碟存取 SQL CLR 中基於安全性考量。因此,您收到 < 徵狀 > 一節所述之錯誤訊息。數個案例可能會導致 CLR 物件轉換成 XML 資料型別。

如需有關 Windows 通訊基礎的詳細資訊,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站]:
http://msdn2.microsoft.com/en-us/library/ms735119.aspx
您可能會收到 < 徵狀 > 一節,在下列案例中所述之錯誤訊息:
  • 明確實作 CLR 物件的 CLR 程式碼使用 XmlSerializer 類別。這些 CLR 物件可能包括預存程序]、 [函式]、 [使用者定義型別]、 [彙總,] 和 [觸發程序。
  • 您在 CLR 程式碼中使用 Web 服務。
  • 您傳送或接收 CLR 物件,或從 SQL Server 藉由使用 SQL Server 直接 HTTP/SOAP 存取。
  • CLR 物件會將使用者定義的型別轉換成 XML 資料型別。

解決方案

如果要解決這個問題,您必須使用 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 原始組件的序列化組件。使用下列方法之一來手動建立序列化組件。

附註這些方法會假設下列情況皆成立:
  • 您已在 SQL Server 2005 的執行個體中建立 dbTest 資料庫。
  • 在 [C:\CLRTest 儲存所有專案檔案的資料夾。

方法 1: 使用 Microsoft Visual Studio 2005 來建置 SQL Server CLR 專案

您可以利用 [建置事件] 選項在 Microsoft Visual Studio 2005 中建立的序列化組件。要這麼做,請您執行下列步驟:
  1. 啟動 Visual Studio 2005。
  2. 建立新的 SQL Server 專案,名為 MyTest。
  3. 在 [新增資料庫參考] 對話方塊按一下 [連接至 dbTest 的資料庫的參考,然後按一下 [[確定]

    如果參考不是在清單中,您必須建立新的參考。執行此動作按一下 [加入新參考]。
  4. 在 [專案] 功能表上按一下 新增使用者定義函數。出現 [加入新項目] 對話方塊。
  5. 按一下 [新增],以新增新的檔案。預設情況下,檔案被命名為 Function1.cs。

    附註您會收到錯誤訊息所述之 < 徵狀 > 一區段如果您將專案部署至資料庫,然後執行下列的 Transact-SQL 陳述式:
    SELECT [dbTest].[dbo].[XMLTest] ()
    您必須遵循的步驟 6 至 16 如果要解決這個問題。
  6. 加入 「 程式碼範例 > 一節 Function1.cs 檔案中所列的程式碼。
  7. 在 [專案] 功能表上按一下 MyTest 內容
  8. MyTest] 對話方塊上按一下 [建置事件] 選項。
  9. Post-build 事件命令列] 方塊中輸入下列命令:
    "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe"/ force"$ (TargetPath)"
    附註/ 強制 選項會產生一個新的序列化組件每當您修改來源組件。此外,您必須修改這項指令,如果另一個資料夾中安裝 Visual Studio 2005。
  10. C:\CLRTest] 資料夾中建立 [Predeployscript.sql 和 Postdeployscript.sql 具名的兩個文字檔案]。
  11. 將下列的 Transact-SQL 陳述式加入至 Predeployscript.sql 檔:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    	DROP ASSEMBLY [MyTest.XmlSerializers]
    
  12. 將下列的 Transact-SQL 陳述式加入至 Postdeployscript.sql 檔:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
    
  13. 在 [專案] 功能表上按一下 [加入現有項目]。
  14. 在 [加入現有項目] 對話方塊找出 [C:\CLRTest] 資料夾並按一下 所有檔案 (* *)檔案類型] 清單中。
  15. 檔案名稱] 方塊中鍵入 Postdeployscript.sql;Predeployscript.sql,再按 [確定]
  16. 在 [建置] 功能表上按一下 部署 MyTest
  17. 在 SQL Server 中執行下列的 Transact-SQL 陳述式管理 Studio:
    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,並按下 ENTER。
  6. 鍵入 csc /t:library MyTest.cs,並按下 ENTER。
  7. 鍵入 sgen.exe/force MyTest.dll,並按下 ENTER。
  8. 執行下列的 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
  9. 在 SQL Server 中執行下列的 Transact-SQL 陳述式管理 Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    收到正確的結果。

如果您使用 [參考其他組件的主要組件必須產生主要組件所參考的所有組件的 XML 序列化組件。然後,您必須載入 SQL Server 資料庫到這些 XML 序列化組件使用 CREATE ASSEMBLY 陳述式。

狀況說明

這種行為是經過設計規劃的。

?考

如需有關從 CLR 的 XML 序列化資料庫物件,請造訪下列 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/ms131088.aspx
如需有關 「 XML 序列化程式產生器 」 工具的詳細資訊,請造訪下列 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx

屬性

文章編號: 913668 - 上次校閱: 2007年5月23日 - 版次: 2.1
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Workgroup Edition
關鍵字:?
kbmt kbsql2005clr kbexpertiseadvanced kbprb KB913668 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。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