2013-03-02 61 views
7

我有一個基於CLR的存儲過程,它使用MsmqIntegrationBinding將消息發佈到遠程MSMQ。在SQL Server 2005中一切正常,但現在有從2005年到2012年的升級假設發生。我試圖在SQL Server 2012中註冊CLR(SP),但在註冊System.ServiceModell.DLL時出現了以下錯誤。在SQL Server 2012中註冊CLR函數(基於WCF)

消息6544,級別16,狀態1,行
CREATE ASSEMBLY裝配 'System.ServiceModel' 失敗,因爲程序集 'microsoft.visualbasic.activities.compiler' 是格式不正確或不是純粹的.NET程序集。 無法驗證的PE標頭/本地存根。

我搜索的分辨率,看來,很少有其他人有同樣的問題,截至目前沒有辦法解決它。

使用MSMQIntegrationBinding的主要原因是我們希望確保每條消息只傳遞一次。正如你所看到的,我對ExactlyOnce屬性非常感興趣,它在正常的system.messaging類中不存在。我們處理了數以千計的消息,並且消息的排序非常重要,每個消息都會加上一個id,並且發送的消息的ID小於以前發送客戶端系統停止的消息(大問題)。

我也使用system.messaging重寫了CLR存儲過程。我只需要建議它是否可以支持我上面提到的場景。

+0

改爲調用WCF服務,它將代理調用隊列。 – abatishchev 2013-03-02 21:37:36

+0

SQL Server和程序集的位數是多少? – abatishchev 2013-03-02 21:38:14

回答

2

我和你有同樣的問題,我不知道是否有解決方案。我發現的是:

有兩種類型的.NET程序集。純.NET組件僅包含MSIL指令。混合程序集包含非託管機器指令和MSIL指令。一般情況下,混合程序集由C++編譯器通過/ clr開關進行編譯,但包含源於本機C++代碼的機器指令。

無論哪個版本的SQL Server,CREATE ASSEMBLY只允許註冊純.NET程序集。 SQL Server始終要求使用CREATE ASSEMBLY加載到SQL Server數據庫中的程序集僅包含MSIL指令(純裝配)。如果要註冊的程序集是混合程序集,則CREATE ASSEMBLY將引發上述錯誤。

http://blogs.msdn.com/b/psssql/archive/2013/02/23/unable-to-register-net-framework-assembly-not-in-the-supported-list.aspx

的一點是,我們真的需要參考System.ServiceModel

所以,我的猜測是,在不久的將來,沒有解決辦法。我們所要做的就是以另一種方式進行編碼。

+1

另一種方式是什麼?你找到了解決方案嗎? – sojim2 2016-10-28 23:54:22