SQL Server 2008 から呼び出す必要がある C/C++ 関数の膨大なライブラリがあります。これらの関数を Win32 DLL からロードDllImport
して .Net コードに公開する C# アダプター クラスを作成しました。これは、ほとんどの .Net アプリケーションで問題なく機能します。
今、私は SQL Server CLR で同じ手法を使用しようとしていました。アダプター クラスを呼び出す一連の CLR 関数とストアド プロシージャを作成します。これは、管理されていない DLL を読み込もうとすると が発生するため、機能しませんSystem.BadImageFormatException
。
拡張ストアド プロシージャを使用してこれを行うことができますが、その方法は推奨されておらず、SQL Server の新しいリリースでは廃止される可能性があります。
CLR ストアド プロシージャからアンマネージ関数を呼び出す適切な方法は何でしょうか? これはアウトプロセスで行うべきだと思います。
これらの関数を公開する Web サービスをストアド プロシージャで呼び出そうとしています。これは良いアイデアのように思えますが、これまでのところ、Web サービス呼び出しを行う SQLCLR アセンブリの展開に問題があります。アセンブリのバージョンに依存するアセンブリをSystem.ServiceModel.dll
読み込めません。version=3.0.0.0
System.Web.dll
2.0.0.0
アセンブリをロードSystem.Web
すると、次のエラーが表示されます。
アセンブリ 'System.Web' は、現在のデータベースに存在しないアセンブリ 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.' を参照しています。SQL Server は、アセンブリの参照元と同じ場所から参照アセンブリを見つけて自動的に読み込もうとしましたが、その操作は失敗しました (理由: バージョン、カルチャ、または公開キーの不一致)。参照されているアセンブリを現在のデータベースに読み込み、要求を再試行してください。
System.Web
アセンブリの展開に関する問題の解決策を見つけました。から展開するのではなく、 から展開するC:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll
必要がありますC:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll
。次に、他のすべての必要なアセンブリもデプロイされます。
デプロイ順のアセンブリのリスト:
- C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\SMdiagnostics.dll
- C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll
- C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.dll
- C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.Selectors.dll
- C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\Microsoft.Transactions.Bridge.dll