在安装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?
不管怎样,谢谢你的帮助。我会接受罗斯的回答,因为我怀疑许多经历过同样问题的人会从他的回答中得到最大的帮助。