5

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.0System.Web.dll2.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
4

1 に答える 1

1

ここでの興味深い議論: MSDN - SQL CLR のアンマネージ コード。DLL がエンジンによってどのようにロードされるかが原因であると思われます。SQL Server の外部の別のサービスでコードをホストし、WCF またはおそらく COM を使用してコードにアクセスするなど、一連のオプションを提示します。最後のオプションは、おそらくコードを純粋なマネージ C++ に再コンパイルすることですが、これはレガシー コードのオプションではない場合があります。

「SQL Server 2005 での CLR 統合について」では、プロセスのしくみに関する詳細を説明しています。

SQL Server 内で存在および実行できるコードをさらに制限するには、各アセンブリを一連のアクセス許可に登録する必要があります。3 つの定義済みセットを使用できます。SAFE、EXTERNAL_ACCESS、UNSAFE ...

また、 CLR 統合セキュリティを確認し、実行しているコードに必要な信頼レベルと、CLR プロセス内でコードにアクセスできるかどうかを判断する必要があります。

于 2011-12-15T22:50:39.577 に答える