【问题标题】:Failed to create assembly 'System.ServiceModel.Internals' in SQL未能在 SQL 中创建程序集“System.ServiceModel.Internals”
【发布时间】:2015-01-07 09:50:42
【问题描述】:

我正在尝试在 SQL 中创建程序集,但无法加载以下 DLL。

System.ServiceModel.Internals

create assembly [system.servicemodel.internals]
from 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.ServiceModel.Internals.dll'
with permission_set = safe;
go

我收到此错误:

消息 6218,第 16 级,状态 2,第 2 行 为程序集“System.ServiceModel.Internals”创建程序集失败,因为程序集“System.ServiceModel.Internals”验证失败。检查引用的程序集是否是最新的并且受信任(对于 external_access 或不安全)以在数据库中执行。如果有任何 CLR 验证程序错误消息将跟随此消息 [ : System.Runtime.IOThreadScheduler+ScheduledOverlapped::.ctor][mdToken=0x6000185][offset 0x00000023][found unmanaged pointer][expected unmanaged pointer] 堆栈上的意外类型。 [ : System.Runtime.IOThreadScheduler+ScheduledOverlapped::Post][mdToken=0x6000183][offset 0x0000000D][found unmanaged pointer][expected unmanaged pointer] 堆栈上的意外类型。 [ : System.Runtime.IOThreadScheduler+ScheduledOverlapped::Cleanup][mdToken=0x6000184][offset 0x00000019][found unmanaged pointer][expected unmanaged pointer] 堆栈上的意外类型。 [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteMessageEvent][mdToken=0x6000357][offset 0x0000004B][found ref 'System.String'] 堆栈上的预期数字类型。 [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteEvent][mdToken=0x6000359][offset 0x0000012B] 指令无法验证。 [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteEvent][mdToken=0x6000359][offset 0x0000003F] 指令无法验证。 [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteEvent][mdToken=0x600035a][offset 0x00000061][found ref 'System.String'] 堆栈上的预期数字类型。 [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteEvent][mdToken=0x600035b][offset 0x0000001F][found unmanaged pointer][expected unmanaged pointer] 堆栈上的意外类型。 [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteTransferEvent][mdToken=0x600035c][offset 0x0000007C] 指令无法验证。 [ : System.Runtime.Diagnostics.DiagnosticsEventProvider::WriteTransferEvent][mdToken=0x600035c][offset 0x000002F4][found Native Int][expected unmanaged pointer] 堆栈上的意外类型。 [...

我看到了这个已解决的问题(几乎 100% 相似)Failed to CREATE AN ASSEMBLY in SQL 所以我尝试做同样的事情

.NET版本的SQL Server和文件相同v4.0.30319

我运行了select * from sys.dm_clr_properties的语句,结果似乎正常。

directory   C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
version v4.0.30319
state   CLR is initialized

SQL 版本: 11.2.5058.0

知道如何创建这个程序集吗?

我需要它,因为当我尝试创建自定义程序集时出现此错误:

Assembly 'DataLoader' references assembly 'system.servicemodel.internals, version=4.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: 2(The system cannot find the file specified.)). Please load the referenced assembly into the current database and retry your request.

【问题讨论】:

  • blacai 有这个运气吗?我也面临同样的问题
  • 目前由于工作量,我无法测试提供的解决方案。如果您可以确认它有效,我将标记为答案
  • @blacai 我可以确认大卫曼宁的回答是正确的:这只是使用UNSAFE 的PERMISSION_SET 而不是SAFE 的问题。可以肯定的是,我正在运行 SQL Server 2012,从上面复制了您的 CREATE ASSEMBLY 代码,运行它,得到错误,将 SAFE 更改为 UNSAFE,再次运行,它工作了。

标签: c# clr .net-assembly sqlclr


【解决方案1】:

您是否尝试过使用 UNSAFE 权限集选项安装程序集?

我在 SQL Server 11.0.5058 上安装了 System.ServiceModel.Internals(来自 GAC 的 v4)作为 UNSAFE,我不知道您是否也会遇到版本控制问题,但我相信程序集只能安装为不安全因为它可能会访问非托管资源。

根据您的错误消息:

[找到非托管指针] [预期的非托管指针] 堆栈上的意外类型。

我理解这是预期的非托管指针,找到非托管指针,不允许非托管指针。

有关权限集的定义,请参阅https://msdn.microsoft.com/en-us/library/ms189566.aspx。

【讨论】:

  • 这是一个版本问题。使用 Everything.exe,我搜索了所有 system.servicemodel.internals.dll,然后选择了与 clr 版本的 sql server 匹配的 dll,是的,它必须标记为 UNSAFE。
【解决方案2】:
  [found ref 'System.String'] Expected numeric type on the stack

堆栈跟踪告诉我们,CLR 验证程序检查了堆栈并发现了一个意外的类型,一个字符串而不是一个数字。这很糟糕。正在执行的相关方法是 System.Runtime.Diagnostics.DiagnosticsEventProvider.WriteTransferEvent(),堆栈跟踪不完整,因此我们无法一直追溯到它。

这是 .NET Framework 中的 .NET 4 新增功能,它支持 ETW(Windows 事件跟踪)。反汇编器可以通过多个层显示使用它的代码,例如 System.ServiceModel.Channels.HttpRequestContext.TraceHttpMessageReceived() 调用它。

换句话说,我们牢牢地处于 WCF 领域,它通过 HTTP 接收消息并生成 ETW 事件,因此可以通过 ETW 工具对其进行跟踪。调用源自核心 WCF 程序集 System.ServiceModel.dll,ETW 跟踪代码位于 System.ServiceModel.Internals.dll 中。

所以,不知何故,考虑到问题的性质,这将如何发生已成定局,SQL Server 机器对这些 WCF 程序集有两个不同的修订版。它们通常成对分布,是基本 .NET 安装的一部分。自从 .NET 4.0 RTM、4.01、4.02、4.03 版本通过 Windows Update 流式传输以来,已经进行了许多修订,这些更新尤其影响了 System.ServiceModel。更不用说从那时起发布的 4.5、4.5.1、4.5.2 和 4.6 版本,以及一些修复错误和修补安全问题的 KB 更新。

期待下一个问题:System.ServiceModel.Internals.dll 的正确版本是什么?您可以致电 Microsoft 支持,他们会告诉您:“没有”。但你已经知道了。所以不要这样做。如果您想尝试使其正常工作,那么基本策略是首先查看 System.ServiceModel 的修订号,然后尝试找到修订号为的 System.ServiceModel.Internals,如果不相等,那么至少在球场上。您现在拥有的几乎可以肯定不是很接近,修订版 34234 大致是一个 .NET 4.5.2 修订版号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2018-03-15
    • 2018-05-19
    • 1970-01-01
    • 2014-01-24
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多