SqlServerSpatial110.dllが見つかりません

こんにちは。beaglesoftの真鍋です。

SQL ServerからGeography型のデータを取得するときに、「SqlServerSpatial110.dllが見つかりません」というエラーが出ることがあります。最初は何のことかさっぱりわからなかったのですが、いろいろと調べたところDbGeoGraphy型が内部でSqlServerSpatial110.dllを利用しているため、あらかじめプログラムの実行時にはロードしておく必要が有るけれども、そのロードを行っていないと発生するエラーのようです。

対応方法としては次の通り対応することで利用可能になりました。

  1. NuGet Packageをインストールする。
  2. アプリケーションごとにロード方法を設定する。
  3. App.configまたはweb.configにバージョンを追加する。

NuGet Packageをインストールする

NuGet Packageのインストールは以下のとおり実行可能です。

Install-Package Microsoft.SqlServer.Types

NuGet Gallery | Microsoft.SqlServer.Types (Spatial) 11.0.2

アプリケーションごとにロード方法を設定する

NuGetのインストール時に表示されるReadmeに記述が表示されますが、以下の設定を行う必要があります。

ASP.NETアプリケーション

Global.asaxApplication_Startメソッドで以下の設定を記述する必要があります。

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));

Windowsアプリケーション

Windowsアプリケーションではアプリケーションの起動時に以下の設定を記述する必要があります。(厳密には、SqlServerSpatial110.dllが実行される前までに読み込まれていれば良いと記述があります。)

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

ユニットテスト

ユニットでストでは、ユニットテストクラスにも上記のNuGet Packageをインストールする必要があります。また、SqlServerSpatial110.dllを利用した処理を実行するテストクラスでは以下のとおり予め読み込み処理を実行する必要があります。

[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
    SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
}

App.configまたはweb.configにバージョンを追加する

App.configまたはweb.configに以下の通りバージョンを指定します。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
        <bindingRedirect oldVersion="10.0.0.0" newVersion="11.0.0.0" />
      </dependentAssembly>
     ...

参考にしたサイト

.net - SqlServerSpatial110.dll failed to copy on Windows Azure deployment - Stack Overflow .net - SqlServerSpatial110.dll failed to copy on Windows Azure deployment - Stack Overflow Microsoft.SqlServer.Types NuGet Package (Spatial on Azure) - ADO.NET Blog - Site Home - MSDN Blogs