在执行一个 CLR 例程或在 SQL Server 中使用的程序集时出现错误消息:"主机存储区中的程序集在 GAC 中具有不同的签名比程序集。(HRESULT 中的异常: 0x80131050)"

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 949080
症状
请考虑下面的方案。

情境 1

创建引用了公共语言运行时 (CLR) 例程Microsoft.NET Framework 程序集。中未介绍的.NET Framework 程序集知识文库文章 922672。然后,在安装.NET Framework 3.5 或基于.NET Framework 2.0 的修复程序。

情境 2

您创建一个程序集,然后 Microsoft SQL Server 数据库中注册程序集。然后,安装不同版本的程序集在全局程序集缓存 (GAC) 中。

当您执行 CLR 例程或在 SQL Server 中使用从这些方案中的任何一个程序集时,您将收到类似于以下错误消息:

服务器: 消息 6522,级别 16,状态 2 行 1
.NET Framework在执行用户定义的例程或聚合的过程中出错getsid:

System.IO.FileLoadException: 无法加载文件或程序集System.DirectoryServices、 版本 = 2.0.0.0,区域性 = 非特定语言,公钥令牌 = b03f5f7f11d50a3a 或其一个依赖项。在主机中的程序集存储有不同的签名程序集与 GAC 中。(HRESULT 中的异常:0x80131050)

System.IO.FileLoadException:
原因
当 CLR 加载程序集时,CLR 对验证相同的程序集位于 GAC 中。如果在同一程序集位于 GAC 中,CLR 进行验证的这些程序集的模块版本 Id (MVIDs) 相匹配。如果这些 MVIDs程序集不匹配,您将收到错误消息,"症状"一节介绍了。

程序集时重新编译后的 MVID程序集的更改。因此,如果您在更新.NET Framework,.NET Framework 程序集具有不同的 MVIDs因为这些程序集将重新编译。此外,如果更新您自己的程序集,该程序集是重新编译。因此,该程序集也具有不同MVID。
替代方法

解决方法 1

要解决情形 1"症状"部分中,您必须手动更新 SQL Server 中的.NET Framework 程序集。要这样做,请使用与更改程序集语句点对新在.NET Framework 程序集版本下面的文件夹:
%Windir%\Microsoft.NET\Framework\版本
注意版本 代表.NET Framework 的版本,您安装或更新。

解决方法 2

若要解决问题2 英寸"症状"部分中,更改程序集语句用于更新中的程序集该数据库。

如果问题仍然存在执行此操作后,从数据库中删除程序集,然后注册新版本的程序集在数据库中。
状态
Microsoft已经确认这是所列出的 Microsoft 产品中的问题在"适用于"部分中。
更多信息
我们不建议使用知识文库文章 922672 中未提及的.NET Framework 程序集。知识文库文章 922672 列出的 SQL Server CLR 承载环境中进行了测试的程序集。

有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
922672 在 SQL Server CLR 承载环境中未经测试的.NET Framework 程序集的支持策略

CLR 例程的说明

CLR 例程包括通过使用实现的下列对象SQL Server 与.NET Framework CLR 集成:
  • 标量值用户定义的函数 (标量Udf)
  • 表值用户定义的函数 (TVFs)
  • 用户定义的过程 (UDPs)
  • 用户定义的触发器
  • 用户定义的数据类型
  • 用户定义聚合

要更新在安装.NET Framework 3.5 英寸后的程序集

在安装.NET Framework 3.5 之后,您必须使用 ALTER 程序集语句来更新下列程序集:
  • Accessibility.dll
  • AspNetMMCExt.dll
  • Cscompmgd.dll
  • IEExecRemote.dll
  • IEHost.dll
  • IIEHost.dll
  • Microsoft.Build.Conversion.dll
  • Microsoft.Build.Engine.dll
  • Microsoft.Build.Framework.dll
  • Microsoft.Build.Tasks.dll
  • Microsoft.Build.Utilities.dll
  • Microsoft.CompactFramework.Build.Tasks.dll
  • Microsoft.JScript.dll
  • Microsoft.VisualBasic.Vsa.dll
  • Microsoft.Vsa.dll
  • Microsoft.Vsa.Vb.CodeDOMProcessor.dll
  • Microsoft_VsaVb.dll
  • Sysglobl.dll
  • System.Configuration.Install.dll
  • System.Design.dll
  • System.DirectoryServices.dll
  • System.DirectoryServices.Protocols.dll
  • System.Drawing.dll
  • System.Drawing.Design.dll
  • System.EnterpriseServices.dll
  • System.Management.dll
  • System.Messaging.dll
  • System.Runtime.Serialization.Formatters.Soap.dll
  • System.ServiceProcess.dll
  • System.Web.dll
  • System.Web.Mobile.dll
  • System.Web.RegularExpressions.dll
这些程序集位于下面的文件夹:
%Windir%\Microsoft.NET\Framework\v2.0.50727

如何保留后删除程序集用户定义的数据类型中的数据

如果删除用户定义的数据类型从 SQL Server 使用的程序集,可以使用下列方法之一来保留的数据。

假设以下方案:
  • 创建其名称是程序集MyAssembly.dll
  • MyAssembly程序集引用System.DirectoryServices.dll程序集。
  • 您有其名称是用户定义的数据类型MyDateTime
  • MyDateTime数据类型使用MyAssembly.dll程序集。
  • 您创建的名为 MyTable 的表。
  • MyTable 表包含MyDateTime数据的数据类型。

方法 1: 使用 bcp.exe 实用程序

  1. 使用 Bcp.exe 实用程序与-n开关一起复制MyTable 表到文件中的数据。例如,运行在命令提示符处执行以下命令:
    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n –SSQLServerName  -T
  2. 在中SQL Server 管理 Studio 中,请执行以下步骤:
    1. 删除表 MyTable。
    2. 删除MyDateTime数据类型。
    3. 删除System.DirectoryServices.dll程序集。
    4. 删除MyAssembly程序集。
  3. 在中SQL Server 管理 Studio 中,请执行以下步骤:
    1. 注册System.DirectoryServices.dll程序集。
    2. 注册MyAssembly程序集。
    3. 创建MyDateTime数据类型。
    4. 创建新的表具有相同的表结构MyTable 表。
  4. 使用 Bcp.exe 实用程序与-n开关到一起将数据从文件导入 MyTable 的表。例如,运行在命令提示符处执行以下命令:
    bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n –SSQLServerName  -T

方法 2: 使用插入命令。.SELECT 语句

假定MyDateTime数据类型在存储中所占 9 字节为单位)。
  1. 在 SQL Server 管理 Studio 中,创建一个新表,通过运行以下包含一列的VARBINARY(9)数据类型语句:
    CREATE TABLE TempTable (c1 VARBINARY(9))
  2. 运行以下命令插入...选择语句来填充TempTable 表:
    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable
  3. 在中SQL Server 管理 Studio 中,请执行以下步骤:
    1. 删除表 MyTable。
    2. 删除MyDateTime数据类型。
    3. 删除System.DirectoryServices.dll程序集。
    4. 删除MyAssembly程序集。
  4. 在中SQL Server 管理 Studio 中,请执行以下步骤:
    1. 注册System.DirectoryServices.dll程序集。
    2. 注册MyAssembly程序集。
    3. 创建MyDateTime数据类型。
    4. 创建新的表具有相同的表结构MyTable 表。
  5. 运行以下命令插入...选择语句来填充MyTable 的表:
    INSERT INTO MyTable SELECT c1 FROM TempTable
参考
有关程序集版本的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) Web 站点: 对于有关如何更新程序集的详细信息,请访问以下 MSDN 网站站点: 对于有关如何删除某个程序集的详细信息,请访问以下 MSDN 网站站点: 对于有关如何在 SQL Server 2005 数据库中,注册程序集的详细信息请访问下面的 MSDN Web 站点: 对于Bcp.exe 实用程序,有关的详细信息,请访问下面的 MSDN Web 站点:

警告:本文已自动翻译

属性

文章 ID:949080 - 上次审阅时间:01/07/2013 20:57:00 - 修订版本: 1.0

Microsoft SQL Server 2012 Enterprise, Microsoft SQL Server 2012 Standard, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2008 R2 Enterprise, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 R2 Datacenter, Microsoft SQL Server 2008 R2 Workgroup, Microsoft SQL Server 2008 R2 Standard, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL 2005 Server Workgroup, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL 2005 Server Enterprise

  • kbexpertiseadvanced kbtshoot kbprb kbmt KB949080 KbMtzh
反馈