.net - CLR 程序集不会在 64 位 SQL Server 2005 中加载

标签 .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

我们在使用这些功能时从未遇到过任何问题。现在,当我们尝试将其中一台服务器升级到 x64 时,我们在调用任何函数时都会遇到错误。示例堆栈跟踪:

System.Data.SqlClient.SqlException: An error occurred in the Microsoft .NET Framework while trying to load assembly id 65549. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error: System.IO.FileLoadException: Could not load file or assembly 'ourfunctions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from 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_ACCESSUNSAFE,而我们使用的是 SAFE 级别。

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

我们在 32 位机器上尝试了完全相同的过程,一切正常。应该是x86和x64的区别。有什么想法吗?

解决方案:我们终于找到了解决方案。事实证明,我们的程序集确实是一个 32 位编译的程序集。在 Visual Studio 中,我们使用目标“任何 CPU”,但在检查底层 .csproj 时,我发现了以下代码片段:

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

所以我们的“任何 CPU”目标实际上是构建一个 x86 程序集!啊啊。我在 subversion 中追踪到了这一行,但它在 2006 年第一次 checkin 时就已经存在了。也许这是数据库项目的某些早期模板中的错误?

无论如何,谢谢你的帮助。我会接受 Russ 的回答,因为我怀疑许多遇到同样问题的人会从他的回答中得到最大的帮助。

最佳答案

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

关于.net - CLR 程序集不会在 64 位 SQL Server 2005 中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2193720/

相关文章:

c# - 如何从自定义 TaskScheduler 回退到默认 TaskScheduler

.net - XML 在现代 nTier 架构中扮演什么角色?

c# - Ultra Numeric Editor 仅将默认设置为最多 2 位小数

php - 为什么在将 MS SQL 数据转换为 MYSQL 时会出现无效字符?

sql-server - SQL 服务器 : how to determine what will break when downgrading a database?

sql - SET 附近的语法不正确。期待外部

x86 - x86、x32 和 x64 架构之间的区别?

c# - 忽略异常类型 : multiple catch block vs. 类型查询的更好方法

java - 为什么 Java 安装在 (x86) 文件夹中?

c# - MSTest 拒绝运行 64 位?