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
これらの機能で問題が発生したことはありません。ここで、サーバーの 1 つを 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、証拠 assemblySecurity、Assembly locationHint、StackCrawlMark&) で
level を使用しているのに対し、エラーには権限セットEXTERNAL_ACCESS
ANDが記載されています。UNSAFE
SAFE
.dll ファイルはターゲット プラットフォームを「任意の 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>
したがって、「任意の CPU」ターゲットは、実際には x86 アセンブリを構築していました。ああああ。Subversion でこの行をたどりましたが、2006 年の最初のチェックイン時にはすでに存在していました。これは、データベース プロジェクトの初期のテンプレートのバグだったのでしょうか?
とにかく、助けてくれてありがとう。同じ問題を経験した多くの人が彼の答えによって最も助けられると思うので、私はラスの答えを受け入れます。