次の方法で共有


CLR UDF からのネイティブ コードへのアクセス

次の例は、アセンブリ内のユーザー定義関数に含まれるネイティブ (アンマネージ) C++ コードの関数をデータベースから呼び出す方法を示しています。

この例では、c:\test を作業ディレクトリとします。

まず次の C++ コードをコンパイルします。

// Win32Sleep.cpp
// compile with: /LD /link /noentry kernel32.lib
#include <windows.h>

extern "C"
__declspec( dllexport ) void _cdecl SleepyLoop(DWORD sleep_interval) {
   Sleep(sleep_interval);
}

さらに、次の C# コードをアセンブリにコンパイルします。

// proc.cs
// compile with: /target:library
using System;
using System.Threading;
using System.Data.Sql;
using System.Runtime.InteropServices;

public class StoreProcedures {

   public static readonly uint SLEEP_LOOP_TIMES = 10;
   public static readonly uint SLEEP_DURATION = 1000;

   [DllImport(@"c:\test\Win32Sleep.dll")]
   internal static extern void SleepyLoop(uint sleepInterval);

   public static void SleepInProcedure(int loopTimes) {
      for ( int i = 0 ; i < loopTimes ; i++ ) {
         // invoke the unmanaged routine
         SleepyLoop(SLEEP_DURATION);
      }
   }
}

最後に、次の Transact-SQL を実行します。

USE MASTER
GO

IF DB_ID('testdb') IS NOT NULL
DROP DATABASE testdb
GO

CREATE DATABASE testdb
GO

USE testdb
GO

ALTER DATABASE testdb SET TRUSTWORTHY ON 
GO

sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO

CREATE ASSEMBLY myasm FROM 'c:\test\proc.dll' WITH PERMISSION_SET=UNSAFE 
go

CREATE PROCEDURE SleepProc(@loopTimes INT)
AS EXTERNAL NAME myasm.[StoreProcedures].[SleepInProcedure]
go

-- sleep 5 seconds
EXEC SleepProc 5
GO

関連項目

概念

CLR (共通言語ランタイム) 統合の使用シナリオと例