CLR程序集无法在64位SQL Server 2005中加载。

6

我们在安装SQL Server 2005(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: 在尝试加载程序集 id 65549 时,Microsoft .NET Framework 发生错误。服务器可能资源不足,或者该程序集没有被信任,带有 PERMISSION_SET = EXTERNAL_ACCESS 或 UNSAFE。请再次运行查询,或查看文档以了解如何解决程序集信任问题。有关此错误的更多信息:System.IO.FileLoadException: 无法加载文件或程序集“ourfunctions,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。给定的程序集名称或代码库无效。(来自 HRESULT 的异常:0x80131047)System.IO.FileLoadException: 在 System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean -snip- 处
错误提到了权限集 EXTERNAL_ACCESS 和 UNSAFE,而我们使用级别 SAFE。
.dll 文件是使用目标平台设置为“Any CPU”构建的,并且当我们尝试从文件加载 dll 而不是 varbinary 语法时,会得到相同的结果。我们已经尝试了 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>

所以我们的“任何CPU”目标实际上构建了一个x86汇编!啊啊啊。我在Subversion中追溯了这行代码,但它已经存在于2006年的第一次提交中。也许这是数据库项目早期模板中的漏洞?

无论如何,感谢您的帮助。我将接受Russ的答案,因为我认为许多遇到相同问题的人最可能从他的答案中得到帮助。

2个回答

0

这与它是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 

我们已经执行了TRUSTWORTHY选项,KB918040中提到了它。我们将尝试其他选项。谢谢回复。 - Teun D

0

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


是的,我们尝试过了,但没有成功。顺便说一下,编码形式和文件形式一样具有可移植性。我们找到了根本原因。将答案添加到我的问题中。 - Teun D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接