7

我有一个基于 CLR 的存储过程,用于MsmqIntegrationBinding将消息发布到远程 MSMQ。在 SQL Server 2005 中一切正常,但现在假设从 2005 升级到 2012。我尝试在 SQL Server 2012 中注册 CLR (SP),但在注册System.ServiceModell.DLL时出现以下错误。

消息 6544,级别 16,状态 1,第 1 行为
程序集“System.ServiceModel”创建程序集失败,因为程序集“microsoft.visualbasic.activities.compiler”格式错误或不是纯 .NET 程序集。无法验证的 PE 标头/本机存根。

我搜索了解决方案,似乎很少有人遇到同样的问题,到目前为止还没有解决方案。

使用的主要原因MSMQIntegrationBinding是我们希望确保每条消息只传递一次。ExactlyOnce如您所见,我对普通 system.messaging 类中不存在的属性非常感兴趣。我们处理数千条消息,消息的排序非常重要,而且每条消息都带有一个 id 标记,如果发送的任何消息的 id 小于先前发送的消息,客户端系统就会停止(大问题)。

我还使用 system.messaging 重写了 CLR 存储过程。我只需要建议它是否可以支持我上面提到的场景。

4

1 回答 1

2

我和你有同样的问题,不知道有没有解决办法。我发现的是:

有两种类型的 .NET 程序集。纯 .NET 程序集仅包含 MSIL 指令。混合程序集包含非托管机器指令和 MSIL 指令。混合程序集通常由带有 /clr 开关的 C++ 编译器编译,但包含由本机 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

所以,我的猜测是,在不久的将来,它没有解决办法。我们要做的是以另一种方式编写代码。

于 2014-06-16T07:30:44.147 回答