【问题标题】:How to fix 'Cannot load dynamically generated serialization assembly' error如何修复“无法加载动态生成的序列化程序集”错误
【发布时间】:2019-06-24 20:52:21
【问题描述】:

“无法加载动态生成的序列化程序集。”在 SQL Server 2008 R2 中执行调用 Web 服务的 clr 函数时出错。

我在 Visual Studio 2017 中有一个数据库项目,其中包含一个调用 Web 服务的 clr 函数。

项目属性包括:

项目设置目标平台 = SQL Server 2008

SQLCLR 目标框架 = .Net Framework 3.5

SQLCLR Build Generate 序列化程序集 = On

序列化程序集是在数据库发布时由部署后脚本在数据库中创建的。 当我将数据库发布到我的 Windows 10 PC 上的 SQL Server 2008R2 实例时,执行 clr 函数会导致“无法加载动态生成的序列化程序集”错误,但是,当数据库发布到我的 PC 上的 SQL2016 实例时,它运行正常

发布部署脚本以注册序列化程序集:

CREATE ASSEMBLY [CifasEdit.XmlSerializers] FROM 'C:\tfs\CIFAS\Source\Database\Hub\CifasEdit\CifasEdit\bin\Release\CifasEdit.XmlSerializers.dll' 
WITH PERMISSION_SET = EXTERNAL_ACCESS;
GO

完整的错误在这里

A .NET Framework error occurred during execution of user-defined routine or aggregate "xxx": 
System.InvalidOperationException: Cannot load dynamically generated serialization assembly. In some hosting environments assembly load functionality is restricted, consider using pre-generated serializer. Please see inner exception for more information. ---> System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) and LoadModule() have been disabled by the host.
System.IO.FileLoadException: 
   at System.Reflection.Assembly.nLoadImage(Byte[] rawAssembly, Byte[] rawSymbolStore, Evidence evidence, StackCrawlMark& stackMark, Boolean fIntrospection)
   at System.Reflection.Assembly.Load(Byte[] rawAssembly, Byte[] rawSymbolStore, Evidence securityEvidence)
   at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames)
   at Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
   at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.
    ...
System.InvalidOperationException: 
   at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
   at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies)
   at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
   at System.Xml.Serialization.XmlSerializer.GetSerializersFromCache(XmlMapping[] mappings, Type type)
   at System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] mappings, Type type)
   at System.Web.Services.Protocols.SoapClientType..ctor(Type type)
   at System.Web.Services.Protocols.SoapHttpClientProtocol..ctor()

【问题讨论】:

    标签: sql-server web-services sql-server-2008-r2 sqlclr


    【解决方案1】:

    所以看起来 VS2017 自动生成的序列化程序集在 SQL Server 2008 R2 上表现不佳,尽管它在 SQL2016 上运行良好。

    为了让 CLR 函数在 2008R2 中正常工作,我将 CLR 代码移到了一个单独的项目中,并使用 sgen.exe 手动生成了序列化程序集,然后注册了两个 dll。

    请务必使用 clr2.0 的 sgen 版本,在我的 PC 上它位于

    C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin
    

    生成序列化程序集的命令是

    sgen.exe c:\YourDir\YourAssembly.dll 
    

    这将创建一个名为 YourAssembly.XmlSerializers.dll 的程序集 向 SQL Server 注册这两个程序集:

    CREATE ASSEMBLY [YourAssembly] FROM 'c:\YourDir\YourAssembly.dll' WITH PERMISSION_SET  = EXTERNAL_ACCESS
    
    CREATE ASSEMBLY [YourAssembly.XmlSerializers] FROM 'c:\YourDir\YourAssembly.XmlSerializers.dll' WITH PERMISSION_SET = SAFE
    

    【讨论】:

    • 感谢您发布解决方案。我记得不久前在某个地方看到过这个,最后才找到它(SQL Server Central forum),但我想我没有很快找到它:(。这是完全相同的问题,但使用 SQL Server 2014 和 Visual Studio 2012 . 我怀疑 CLR 4(由 SQL Server 2012 和更新版本使用)与 CLR 2(由 SQL Server 2005、2008 和 2008 R2 使用)发生了变化。
    • 直到现在才看到这个。最好的做法是单独生成序列化程序集,而不是使用 VS 创建的任何东西。
    • @NielsBerglund 当 VS 创建序列化程序集时,它使用 SGEN。默认情况下它创建一个。序列化程序集在运行时动态生成,除非您通过额外的构建步骤强制生成它们。这是使用高流量 Web/REST 服务减少冷启动时间的常见做法
    • @LizNett VS 不生成任何序列化程序集。序列化程序集是在应用程序启动时动态生成的。为避免这种情况,您必须通过在构建后步骤中调用 sgen 来显式生成序列化程序集
    • @PanagiotisKanavos 作为在构建后步骤中调用 sgen 的替代方法,您还可以设置项目属性 SQLCLR Build Generate serialization assembly = On,并在项目构建时生成序列化程序集。我遇到的问题是,以这种方式生成的序列化程序集在 SQL2008R2 数据库中不起作用,如上所述。
    猜你喜欢
    • 2015-10-12
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多