web-dev-qa-db-ja.com

ASP.NET Core 1.0アプリケーション内でSqlServer.Types /空間タイプを使用する方法

クラスライブラリの1つは、DbGeographyのようなMicrosoft空間タイプを使用しています。古いバージョンのSQL ServerとVisual Studioがないクリーンなマシンでアプリケーションを実行すると、次の例外が発生します。

アセンブリ 'Microsoft.SqlServer.Types'バージョン10以降が見つからなかったため、このプロバイダーでは空間タイプと空間関数を使用できません。

解決策は明らかにこのnugetパッケージをインストールすることです:

Install-Package Microsoft.SqlServer.Types

インストール後、nugetパッケージは各プロジェクトタイプからDLLを参照する方法の手順を示します。

空間データタイプを使用するアプリケーションを、「SQL ServerのシステムCLRタイプ」がインストールされていないマシンにデプロイするには、ネイティブアセンブリSqlServerSpatial110.dllもデプロイする必要があります。

このアセンブリのx86(32ビット)バージョンとx64(64ビット)バージョンの両方が、SqlServerTypes\x86およびSqlServerTypes\x64サブディレクトリの下のプロジェクトに追加されました。 C++ランタイムがインストールされていない場合に備えて、ネイティブアセンブリmsvcr100.dllも含まれています。

実行時にこれらのアセンブリの正しい1つをロードするコードを追加する必要があります(現在のアーキテクチャによって異なります)。

ASP.NETアプリケーションASP.NETアプリケーションの場合、Global.asax.csのApplication_Startメソッドに次のコード行を追加します。SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath( "〜/ bin"));

デスクトップアプリケーションデスクトップアプリケーションの場合、空間操作が実行される前に実行する次のコード行を追加します。SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

Nugetパッケージプロジェクトサイトは応答しないため、これが2016年に現在使用する最良のアプローチであるかどうかはわかりません。

私の問題は、ASP.NET Core 1.0アプリケーションからLoadNativeAssembliesを呼び出す方法がわからないことです。 コアフレームワークではなく、完全なフレームワーク(net461)を使用しています。

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        ...
        SqlServerTypes.Utilities.LoadNativeAssemblies(env.WebRootPath);
        ...
    }
}

ASP.NET 1.0アプリケーション内にSqlServer.Types dllファイルを含める最良の方法は何ですか?

関連する質問 ここここ がStackOverflowにあります。

どうもありがとう。

16
Ender2050

今日私はこれをASP.NET Coreアプリケーション(元のポスターと同じ.NET Coreではなく、.NET Frameworkの下にある)で動作させました。

NugetパッケージをASP.NET Coreサイトに直接追加しても、追加のファイルが生成されないことに気付きました。パッケージがASP.NET Coreで動作するように更新されたかどうか不明ですか?

とにかく、私はパッケージを従来の.NET Framework 4.xプロジェクトに追加し、それが作成するSqlServerTypesフォルダーを削除し、そのフォルダーをASP.NET Coreプロジェクトのルートに配置しました。下の4つのDLLすべての_Copy to Output Dicrectory_プロパティを_Do not copy_から_Copy Always_に変更し、LoadLibrary()への呼び出しを追加しました。

パッケージの14.xバージョンは実際にはSQL vNextであり、まだリリースされていないことに注意してください。私の心の中でプレリリースとしてマークされているはずです。 SQL 2016を使用しているため、13.xを使用しました。

ミドルウェア、ServiceInjection、またはホスティング構成のセットアップとは何の関係もないため、元々はProgram.csファイルに入れていました。しかし、それでは、醜く感じた反射からパスを渡す必要があります。そこで、HostingEnvironmentパスを使用できるので、代わりにそれをスタートアップコンストラクターの最初の行として配置します。

_public Startup(IHostingEnvironment env)
{
    SqlServerTypes.Utilities.LoadNativeAssemblies(env.ContentRootPath);

    //The normal config as usual down here...
    var configuration = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
}
_
4
Nick Albrecht

これをweb.configファイルのbindingRedirectで修正します。

  <dependentAssembly>
    <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" />
  </dependentAssembly>

sQL 2016、ASP.NET(コアなし)、EF 6.0.0.0を使用している

3
emo

私はそれを修正しました、それはクリーンな修正ではありません、確かにそれはすべてクリーンです:

/ binという名前のパッケージにsql server typesパッケージを含むフォルダーを作成する必要がありました...そして、sql server typesを使用しているasp net coreプロジェクトによって参照されるすべてのプロジェクトでそれを実行する必要があったため、バグまたはターゲットファイルの不適切な動作。

/ binのコンテンツは期待どおりにソース管理されないため、この回避策はチームの全員が行う必要があることに注意してください。

私はそれが役立つことを願っています(それが修正されている間)

(まあ、遅すぎます。明日は問題の原因と修正方法についてもう少し考えます。より良い回避策が見つかった場合は、期待どおりにビルドされて実行されることを知らせます)

0
Juan

.netコア2.0の使用。上記のnugetパッケージをインストールした後、これをProgram.csのBuildWebHost(args).Run();の行の前に配置します。そしてそれは働いた。

Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory); SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types、Version = 14.0.0.0、Culture = neutral、PublicKeyToken = 89845dcd8080cc91";

0
graemep

これは私にとってはうまくいったようです:

    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            ...
            SqlServerTypes.Utilities.LoadNativeAssemblies(env.WebRootPath + @"path to the project that contains the SQLServerTypes folder");
            ...
        }
    }

IHostingEnvironment.WebRootPathはwwwrootを指すパスを返しますが、私のソリューション設定ではそのフォルダー内に複数のプロジェクトがあるので、どのプロジェクトを指すかを伝えるだけで役に立ちました。これが役に立たない場合は申し訳ありません。

0
LeRoi