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

Teu*_*n D 6 .net sql-server 64-bit sqlclr

我们在安装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
Run Code Online (Sandbox Code Playgroud)

我们从未遇到过这些功能的任何问题.现在,当我们尝试将其中一个服务器升级到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:at System.Reflection.Assembly.nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,Assembly locationHint,StackCrawlMark&stackMark,Boolean throwOnFileNotFound,Boolean -snip-

错误提到权限集EXTERNAL_ACCESSAND 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>
Run Code Online (Sandbox Code Playgroud)

所以我们的"任何CPU"目标实际上是构建一个x86程序集!Aaargh.我已经在颠覆中找回了这一行,但它在2006年首次登记已经存在.也许这是数据库项目的早期模板中的一个错误?

无论如何,谢谢你的帮助.我会接受拉斯的答案,因为我怀疑许多遇到同样问题的人最能得到他的回答.

Rus*_*rry 0

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

ALTER DATABASE YOURDATABASEHERE
SET TRUSTWORTHY ON;
GO
Run Code Online (Sandbox Code Playgroud)

如果仅此方法不起作用,您也可以尝试这些选项

USE YOURDATABASEHERE
GO
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO 
Run Code Online (Sandbox Code Playgroud)