代码之家  ›  专栏  ›  技术社区  ›  Teun D

将不会在64位SQL Server 2005中加载CLR程序集

  •  6
  • Teun D  · 技术社区  · 14 年前

    在安装SQLServer2005(32位)时,我们使用带有一些用户定义函数的程序集。我们使用如下脚本将其部署到生产环境中:

    CREATE ASSEMBLY [Ourfunctions]
    AUTHORIZATION [dbo]
    FROM 0x4D5A9000...000
    WITH PERMISSION_SET = SAFE
    GO
    CREATE FUNCTION [dbo].[GLOBAL_FormatString](@input [nvarchar](4000))
    RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER
    AS 
    EXTERNAL NAME [Ourfunctions].[UserDefinedFunctions].[GLOBAL_FormatString]
    GO
    

    我们从未遇到过这些功能的任何问题。现在,当我们试图将一台服务器升级到x64时,调用任何函数时都会出错。样本堆栈跟踪:

    system.data.sqlclient.sqlException:一个 Microsoft.NET中发生错误 尝试加载时的框架 程序集ID 65549。服务器可能 资源不足,或 程序集可能不受信任 权限设置=外部访问或 不安全的。再次运行查询,或检查 查看如何解决 程序集信任问题。为了更多 有关此错误的信息: System.IO.FileLoadException:无法 加载文件或程序集的函数, 版本=0.0.0.0,区域性=中性, publicKeyToken=空或其一个 依赖关系。给定的程序集名称 或基本代码无效。(例外) 来自hresult:0x80131047) System.IO.FileLoadException:位于 system.reflection.assembly.nload(assemblyname 文件名,字符串基本代码,证据 程序集安全性,程序集 位置提示,StackCrawlMark& 堆叠标记,布尔型 throwonfilenotfound,布尔值-snipt-

    错误提到了权限集 EXTERNAL_ACCESS UNSAFE 而我们使用水平仪 SAFE .

    .dll文件是在目标平台设置为“any cpu”的情况下生成的,当我们尝试从文件而不是varbinary语法加载dll时,会得到相同的结果。我们已经在 http://support.microsoft.com/kb/918040

    我们在一台32位机器上尝试了完全相同的程序,但一切都正常。它必须是x86和X64之间的区别。有什么想法吗?

    解决方案:我们终于找到了解决方案。事实证明,我们的程序集实际上是32位编译的。在Visual Studio中,我们使用了目标“any cpu”,但在检查基础.csproj时,我发现了以下代码片段:

      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        ...other elements...
        <PlatformTarget>x86</PlatformTarget>
      </PropertyGroup>
    

    所以我们的“any cpu”目标实际上是构建一个x86程序集!哎呀!我在Subversion中追踪到了这条线,但它在2006年的首次登记时就已经存在了。也许这是数据库项目早期模板中的一个bug?

    不管怎样,谢谢你的帮助。我会接受罗斯的回答,因为我怀疑许多经历过同样问题的人会从他的回答中得到最大的帮助。

    2 回复  |  直到 14 年前
        1
  •  0
  •   Russ Bradberry    14 年前

    这与它是64位的事实无关,您需要更改数据库以允许它。试试这个:

    ALTER DATABASE YOURDATABASEHERE
    SET TRUSTWORTHY ON;
    GO
    

    如果单靠这个不行,你也可以试试这些选择。

    USE YOURDATABASEHERE
    GO
    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'Ole Automation Procedures', 1;
    GO
    RECONFIGURE;
    GO 
    
        2
  •  0
  •   Piotr Rodak    14 年前

    您可以尝试从文件加载程序集。我不确定是否可以使用编码字符串语法将32位版本上编码的程序集部署到64位SQL Server。

    推荐文章