2

アンマネージアセンブリをロードするためのP/Invokeメソッドを持つ.Netアセンブリ(64ビット環境)があります。.Netアセンブリで使用可能なメソッドをSQLストアドプロシージャに使用したいと思います。これの目的は、SQLで実現された例外とエラーのエラーログを記録することです。

以下は、SQLに含める.Netアセンブリのメソッドです。MyLogger.Logger.LogInfoメソッドは、管理されていないアセンブリをロードするためのP/Invokeメソッドを内部に持つMyLoggerアセンブリで定義されます。

public class SQLLogger
{
    [Microsoft.SqlServer.Server.SqlFunction()]
    public static void LogInfoMessage(SqlString infoMessage)
    {            
        MyLogger.Logger.LogInfo(infoMessage.ToString());          
    }

.Netアセンブリを作成し、SQL Server2008R2で以下のクエリを実行しました。

 CREATE assembly SQLLogger from 'C:\tmp\SQLLogger.dll' WITH PERMISSION_SET = SAFE 

参照先MyLogger.dllも同じフォルダに保存しましたが、以下の例外が発生します。

安全なアセンブリ「MyLogger」のタイプ「MyLogger.Logger」にpinvokeimplメソッドがあるため、CREATEASSEMBLYが失敗しました。P / Invokeは、安全なアセンブリでは許可されていません。

パーミッションセットの値Unrestricted、External Accessを使用して、SQLでアセンブリを手動で作成しようとしましたが、作成できませんでした。

外部アクセス許可セットと無制限許可セットの手動操作中に、以下のエラーが発生します。

SqlAssembly'SQLLogger'の作成に失敗しました。(Microsoft.SqlServer.Smo)追加情報:

Transact-SQLステートメントまたはバッチの実行中に例外が発生しました。(Microsoft.SqlServer.ConnectionInfo)

アセンブリ'mylogger、version = 1.0.0.0、culture = neutral、publickeytoken=b8f8bb225641c4a3。' SQLカタログに見つかりませんでした。(Microsoft SQL Server、エラー:6503)

関連する投稿がいくつかありますが、私はそれから解決策を得ることができませんでした、

SQLServer2008からのアンマネージC/C++DLL関数の呼び出し

http://social.msdn.microsoft.com/Forums/en-US/sqlnetfx/thread/4a032c4b-1402-4c53-b34e-8c8bd724f904

ご協力いただきありがとうございます!!!

4

2 に答える 2

2

したがって、参照されているアセンブリを自動的にロードできないという不満があります。次のように、他のアセンブリもロードしようとするとどうなりますか。

CREATE ASSEMBLY MyLogger FROM 'C:\tmp\MyLogger.dll' WITH PERMISSION_SET = UNSAFE

次に、参照アセンブリを試してください。

CREATE ASSEMBLY SQLLogger FROM 'C:\tmp\SQLLogger.dll' WITH PERMISSION_SET = UNSAFE
于 2013-03-26T10:59:48.730 に答える
0

PERMISSION_SET = UNSAFEを使用してみましたか?これは、アセンブリが管理されていないリソースを使用できるようにするために必要です。

于 2013-03-25T12:46:01.807 に答える