2014-07-17 94 views
2

我正在將SQL Server 2008遷移到2012年,並且遇到了爲CLR例程創建一些必要程序集的挑戰。該例程取決於stdole.dll,但我無法創建此程序集。我的代碼如下:無法在SQL Server 2012中註冊stdole程序集

ALTER DATABASE main SET TRUSTWORTHY ON; 

create assembly [stdole] 
from 
'C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies\stdole.dll' 
WITH PERMISSION_SET = unsafe 

我收到以下錯誤:

Warning: The Microsoft .NET Framework assembly 'stdole, version=7.0.3300.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.' you are registering is not fully tested in the SQL Server hosted environment and is not supported. In the future, if you upgrade or service this assembly or the .NET Framework, your CLR integration routine may stop working. Please refer SQL Server Books Online for more details. 
Msg 10332, Level 16, State 1, Line 3 
Assembly "stdole" was built using version v1.0.3705 of the .NET Framework. SQL Server currently uses version v4.0.30319. 

我目前使用具有系統管理員權限,所以我有UNSAFE ASSEMBLY權限的帳戶登錄。

請幫忙!我一直在研究這個小時,但找不到任何有用的東西。

感謝

+0

什麼是錯誤?我只看到一個警告。 – TomTom

+0

@TomTom:第一行是警告,但是它下面的兩行是一個硬性錯誤。 –

+0

您可能不應該從SQL Server調用Office Interop程序集!我會推薦一種替代方法(例如數據庫中的作業隊列表和一個執行此工作的.NET CLI應用程序 - 可能每隔幾分鐘由任務調度程序運行以檢查隊列) –

回答

5

的關鍵信息是錯誤地注意到兩個不同的.NET版本:

Assembly "stdole" was built using version v1.0.3705 of the .NET Framework. SQL Server currently uses version v4.0.30319

的Microsoft SQL Server不允許進行混合模式CLR。意思是,它是靜態鏈接到一個特定的系列。 SQL Server 2005,2008和2008 R2鏈接到2.0系列(2.0,3.0和3.5),而SQL Server 2012和2014鏈接到4.0系列(4.0和4.5)。更多細節可以在here找到。

因此,從SQL Server 2012開始加載該版本的stdole.dll是不可能的。不幸的是,該文件夾中沒有其他DLL鏈接到4.0系列框架。

編輯:
試試下面的,因爲它導致具有相同publickeytoken(即b03f5f7f11d50a3a)和SQL Server 2012的想法是提取基本代碼(通過ILDASM)成功加載,然後是一個DLL將其重新鏈接到較新的框架(通過ILASM)。我不確定你的代碼是否需要重新編譯。

  1. 打開「Visual Studio命令提示符」/「開發人員命令提示符」(不是常規的「命令提示符」)。

  2. 運行下面的語句:
    MKDIR C:\TEMP\stdole
    CD C:\TEMP\stdole
    XCOPY /V "C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies\stdole.dll" .
    ILDASM stdole.dll /out:stdole.il
    ILASM /DLL /OPTIMIZE /OUTPUT=stdole-4.0.dll /RESOURCE=stdole.res stdole.il

  3. 運行在SSMS如下:
    USE [main];
    CREATE ASSEMBLY [stdole] FROM 'C:\TEMP\stdole\stdole-4.0.dll' WITH PERMISSION_SET = UNSAFE;

注:

+1

它的工作原理!非常感謝!我從來不會想到我自己。 – ChandlerPelhams

+0

@ChandlerPelhams:不是問題。這是一個有趣的問題要解決。我只想到這一點,因爲幾個月前我不得不重新簽署一個程序集,並進行了一些研究以找到這種方法(但在我的情況下,我需要爲證書執行更多步驟)。但我只是接受了一個有教養的猜測,即如果反彙編是可能的,那麼很可能重新鏈接將它綁定到較新的框架(假設沒有任何方法調用已被刪除)。你是否必須重新編譯你的代碼? –

+1

不,我能夠註冊所有程序集,並在使用修改的'stdole.dll'文件後創建CLR過程。 – ChandlerPelhams