2011-12-15 14 views
5

SQL Server 2008から呼び出される必要があるC/C++関数の膨大なライブラリがあります。 これらの関数をWin32 DLLからロードするC#アダプタクラスを作成しましたDllImportとし、それらを.Netコードに公開します。これはほとんどの.Netアプリケーションで完璧に動作します。
今、SQL Server CLRで同じ手法を使用しようとしていました。私は、アダプタクラスを呼び出すCLR関数とストアドプロシージャのセットを作成します。これは、アンマネージDLLの結果をロードしようとすると、System.BadImageFormatExceptionになりません。
拡張ストアドプロシージャでこれを行うことはできますが、そのメソッドは廃止され、新しいSQL Serverリリースでは廃止される可能性があります。
CLRストアドプロシージャからアンマネージ関数を呼び出す正しい方法は何ですか?これはプロセス外で行うべきだと私は推測しています。SQL Server 2008からアンマネージC/C++ DLL関数を呼び出す


私は自分のストアドプロシージャをこれらの機能を公開するWebサービスとして呼び出そうとしています。これは良いアイデアのように思えますが、これまではWebサービスコールを行うSQLCLRアセンブリのデプロイメントに問題があります。私はSystem.ServiceModel.dllアセンブリversion=3.0.0.0をロードすることができません。System.Web.dllアセンブリバージョン2.0.0.0に依存しています。私はSystem.Webアセンブリを展開する問題の解決策を発見した

Assembly 'System.Web' references assembly 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: version, culture or public key mismatch). Please load the referenced assembly into the current database and retry your request.

ロード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通信基盤\ SMdiagnostics.dll \ \ WINDOWS \ Microsoft.NET \ Frameworkの\ v3.0の
  • 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アセンブリ\ Microsoft \ Framework \ v3.0 \ System.IdentityModel.dll
  • C:\プログラムファイル\リファレンスアセンブリ\マイクロソフト\ Frameworkの\ v3.0の\ System.IdentityModel.Selectors.dll
  • C:\ WINDOWS \ Microsoft.NET Windows通信基盤\枠組み\ v3.0の\ Microsoft.Transactions \ .Bridge.dll
+0

32ビットのアンマネージdllを64ビットサーバーにロードしようとしていますか? – GSerg

+0

サイドリファレンスとして[これはプロセス外で行うことができます](http://stackoverflow.com/questions/752357/sql-server-2008-how-crash-safe-is-a-clr-stored-手続き - that-loads-unmanaged-l)、しかし私はそれが要件ではないと確信しています。 – GSerg

+0

まあ、私は可能な限りそれを行う必要があります。はい、32ビットの管理されていない、私はサーバーが32ビットだと思うが、64ビットOSです。 私はその投稿を見ました。彼らは拡張ストアドプロシージャを使用していますが、これは廃止予定です。 – Ramzay

答えて

1

ここでの説明はMSDN - Unmanaged code in SQL CLRです。私はそれがどのようにDLLがエンジンによって読み込まれているのかと思う。彼らは、別のサービスでSQL Serverの外部にコードをホストし、WCFまたはおそらくCOMを使用してコードにアクセスするなど、一連のオプションを提示します。最終的なオプションは、コードを純粋に管理されたC++に再コンパイルすることですが、これはレガシーコードのオプションではないかもしれません。

Understanding CLR Integration in SQL Server 2005は、プロセスがどのように機能するかについてより多くの情報を提供します。

To further restrict the code that is allowed to exist and execute inside SQL Server each assembly must be registered with a set of permissions. Three pre-defined sets are available to use; SAFE, EXTERNAL_ACCESS and UNSAFE ...

またCLR Integration Securityを確認し、信頼レベルは、あなたが実行し、とにかくCLRプロセス内のコードを使用してアクセスすることができますかどうかをしているコードのために必要なdetemrine必要があります。

+0

ありがとうございます。これは面白いですが、本当に解決策はありません。 – Ramzay

関連する問題