【发布时间】: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