【问题标题】:Cannot load dynamically generated serialization assembly - SQL Server 2008 R2 CLR无法加载动态生成的序列化程序集 - SQL Server 2008 R2 CLR
【发布时间】:2015-12-16 01:53:46
【问题描述】:

我在运行存储过程时遇到问题,这些过程在我构建并经过全面单元测试的自定义 .Net 程序集中执行方法。在 SQL Server 2014 中,我的解决方案可以正常工作,并且存储的过程执行得很好,只有当我使用 SQL Server 2008 R2 时才会出现这些错误。

问题是当我将程序集添加到 SQL Server 2008 R2、创建存储过程并像这样执行其中一个时:

 EXEC dbo.Avatas_CallAddCustomerAndAddCreditCardService 4111111111111111, '1025' , 925 , 
      3500, '20/20' , 'asdf' , 1111, 1111 , '600094' , '0442375110' , 
      'asdf' , 'asdf' , '01' , NULL , 7777

我收到以下错误:

消息 6522,级别 16,状态 1,ProcedureAvatas_CallAddCustomerAndAddCreditCardService,第 0 行
在执行用户定义的例程或聚合“Avatas_CallAddCustomerAndAddCreditCardService”期间发生 .NET Framework 错误: System.InvalidOperationException:无法加载动态生成 序列化汇编。在某些托管环境中组装负载 功能受到限制,请考虑使用预生成的序列化程序。 有关详细信息,请参阅内部异常。

System.IO.FileLoadException:LoadFrom()、LoadFile()、Load(byte[]) 和 LoadModule() 已被主机禁用。

System.InvalidOperationException:
在 System.Xml.Serialization.Compiler.Compile(程序集父,字符串 ns, XmlSerializerCompilerParameters xmlParameters,证据证据)
在 System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters 参数,Assembly 程序集, 哈希表程序集)在 System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] 类型、字符串默认命名空间、字符串位置、证据 证据)在 System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping、Type type、String defaultNamespace、String location、 证据证据)在 System.Xml.Serialization.XmlSerializer..ctor(类型类型, XmlAttributeOverrides 覆盖,Type[] extraTypes,XmlRootAttribute root, String defaultNamespace, String location, Evidence evidence)
在 System.Xml.Serialization.XmlSerializer..ctor(类型类型, XmlRootAttribute 根)在 FirestreamAvatasCustomerVault.AscendAvatasInt35.AvatasWebServiceCaller.DeserializeAvatasResponse(字符串 响应)在 FirestreamAvatasCustomerVault.AscendAvatasInt35.AvatasWebServiceCaller.CallManageCustomerService(Int32 personId,字符串地址1,字符串地址2,Int32 cityId,Int32 stateProvId,字符串 zip,字符串电话,字符串 firstName,字符串 姓氏,字符串公司,Nullable1 customerVaultId, Nullable1 客户 ID)在 FirestreamAvatasCustomerVault.AscendAvatasInt35.AvatasWebServiceCaller.CallAddCusto...

我已将 Generate Serialization Assembly 更改为 On 并注册了由它生成的 XMLSerializers.dll 以及注册的实际 dll。

这是我创建的存储过程和程序集:

CREATE ASSEMBLY [Avatas]
AUTHORIZATION [dbo]
FROM 'D:\TFS Workspace\Firestream\Dev\AvatasCustomerVault\FirestreamAvatasCustomerVault\FirestreamAvatasCustomerVault.AscendAvatasInt35\bin\.Net 3.5'
WITH PERMISSION_SET = UNSAFE
CREATE ASSEMBLY [Avatas.XmlSerializers]
AUTHORIZATION [dbo]
FROM 'D:\TFS Workspace\Firestream\Dev\AvatasCustomerVault\FirestreamAvatasCustomerVault\FirestreamAvatasCustomerVault.AscendAvatasInt35\bin\.Net 3.5\FirestreamAvatasCustomerVault.AscendAvatasInt35.XmlSerializers.dll'
WITH PERMISSION_SET = UNSAFE

exec('CREATE PROCEDURE [dbo].[Avatas_CallAddCustomerAndAddCreditCardService](@creditCardNumber bigint, @expirationDate nvarchar(10), @ccv int, 
         @personId int, @address1 nvarchar(100), @address2 nvarchar(100), 
@cityId int,
         @stateProvId int, @zip nvarchar(50), @phone nvarchar(20), @firstName nvarchar(150), @lastName nvarchar(150), @company nvarchar(150), @customerVaultId int, @clientId int)
AS EXTERNAL NAME [Avatas].[FirestreamAvatasCustomerVault.AscendAvatasInt35.AvatasWebServiceCaller].[CallAddCustomerAndAddCreditCardService]')

实际发生错误的行如下:

XmlSerializer serializer = new XmlSerializer(typeof(AvatasResponse), xRoot);

【问题讨论】:

  • 哦,是的,我还确保我值得信赖
  • 会不会是版本问题?在我的脑海中,我不确定 CLR 2014 使用哪个版本,但如果你的程序集被编码到那个版本中,那么我想这可能会导致另一个程序集不被加载
  • 哦,是的,我应该提到,我实际上已经将程序集编译到 .Net 3.5 中,所以我认为这不是版本问题,我也有我正在使用的 NewtonsoftJson 包编译到.Net 3.5
  • 这可能是stackoverflow.com/questions/31570763/… 的副本。那里有任何信息可以帮助您吗?似乎 2008 R2 在这两个问题之间是共同的。 2008 R2 和 2014 之间的一个主要区别是 2008 R2 使用 CLR v2,而 2014 使用 CLR v4。 也可能 Microsoft 在版本之间更改了 CLR 主机的属性并且没有记录它。错误确实显示“LoadFrom()、LoadFile()、Load(byte[]) 和 LoadModule() 已被主机禁用。”
  • 我看了那个问题,我确实尝试将权限更改为安全、外部访问和不安全,但这些都没有帮助。事情中断的实际行现在包含在我上面的帖子中,它在 XMLSerializer 类初始化中,这不是那些被排除的方法之一

标签: .net sql-server stored-procedures sql-server-2008-r2 sqlclr


【解决方案1】:

我找到的最终解决方案是 SQL Server 2008 和 2008 R2 仅支持编译到 .Net Framework 3.5 版的 dll。而 SQL Server 2012+ 仅支持版本 4 及更高版本。

【讨论】:

  • 所以解决方案是 SQL Server 降级到 2008/R2?
  • 如果您使用的是 SQL Server 2008 R2 或更低版本,解决方案是在较低版本的 .Net 中构建 DLL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 2017-04-30
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多