如何将ILMerge与SQL Server 2005 CLR程序集和XmlSerializer一起使用

时间:2012-01-31 20:09:27

标签: sql-server-2005 .net-3.5 clr xmlserializer ilmerge

我有四个程序集(加上.NET 3.5 system.core),我在SQL Server 2005数据库中安装为不安全的CLR程序集。以正确的顺序安装程序集(基于它们的依赖项)工作正常,我能够使用我需要的CLR函数。如果可能的话,我想在四个程序集上使用ILMerge,这样我就可以只安装一个DLL。无论如何,只有一个程序集直接从SQL端引用;其他人都是依赖。碰巧这四个程序集中的一个是使用sgen生成的XmlSerializer程序集,这是必需的,因为SQL Server CLR不允许在运行时创建序列化程序。

在以下讨论中,将调用程序集:

  1. ClrIntegration.dll (这是Visual Studio 2008中的CLR库,是实际从SQL引用的唯一库)
  2. CalcLibrary.dll (这只是ClrIntegration.dll使用的.NET 3.5库)
  3. CalcLibrary.Schema.dll (这是一个.NET 3.5库,其代码完全是通过在两个.xsd文件上运行xsd.exe生成的 - CalcLibrary.dll使用此库)
  4. CalcLibrary.Schema.XmlSerializers.dll (这是通过在CalcLibrary.Schema上运行sgen生成的,并由CalcLibrary.dll中的XmlSerializer自动使用)
  5. 据我所知,无法直接从ClrIntegration项目引用我的VS2008解决方案中的CalcLibrary.dll版本。相反,我必须在正在运行的SQL Server 2005实例上安装CalcLibrary.dll,并将其作为数据库引用添加到ClrIntegration项目中。这是一件令人讨厌的事情,但到目前为止我已经成功了。

    我在ClrIntegration项目中用作后期构建事件的基本命令行是:

    "c:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" /targetplatform:v2 /out:ClrMergedAssembly.dll \
    "$(TargetDir)ClrIntegration.dll" \
    "$(SolutionDir)Source\CalcLibrary\$(OutDir)CalcLibrary.dll" \
    "$(SolutionDir)Source\CalcLibrary.Schema\$(OutDir)CalcLibrary.Schema.dll" \
    "$(SolutionDir)Source\CalcLibrary.Schema\$(OutDir)CalcLibrary.Schema.XmlSerializers.dll"
    

    我在这里遇到了一些问题。

    1. 如果我只是运行ILMerge,如上所示,它可以工作,我得到ClrMergedAssembly.dll。我可以在SQL Server 2005上安装ClrMergedAssembly.dll,但是当我尝试使用它时,使用XmlSerializer的任何内容都会给我一个错误:

        

      在执行用户定义的例程或聚合“Whatever”期间发生.NET Framework错误:
        System.InvalidOperationException:无法加载动态生成的序列化程序集。在某些托管环境中,组件加载功能受到限制,请考虑使用预生成的序列化程序。

      这与我根本不生成XmlSerializer时遇到的错误相同。我发现this excellent blog entry表示在ILMerge之后需要再次运行sgen,但这样做会产生两个问题。首先,我真的需要sgen才能在CalcLibrary.Schema.dll上运行 。在整个装配上运行它将会严重失败;事实上,这就是为什么CalcLibrary.Schema首先与CalcLibrary分开。其次,将序列化程序分开有点违背了使用ILMerge的目的:我只想部署一个DLL。这里有解决方案吗?

    2. ILMerge安装附带的ILMerge.doc文件似乎建议添加/union和/或/closed可能会解决一些问题。但是,单独使用/union/union以及/closed会导致ILMerge失败,并显示以下错误:

        

      合并期间发生异常:
        不允许未解析的程序集引用:CalcLibrary。

      堆栈跟踪跟随错误。我怀疑是因为ClrIntegration必须引用CalcLibrary的数据库版本而不是VS2008解决方案的版本,ILMerge无法找到类型,因此即使CalcLibrary.dll是同一个库,也无法完成联合。我的怀疑是否正确?有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

你做不到。框架代码总是在不同的程序集中查找sgen生成的类 - 以.XmlSerializers后缀命名的程序集 - 并且它在框架中是硬编码的。检查您选择的反编译工具。