2016-12-02 21 views
2

私のWindowsクラスライブラリ(MVC Webサイトで消費されます)では、 NugetPackage Microsoft.SqlServer.Types (Spatial)をインストールしました。'Microsoft.SqlServer.Types.SqlGeography'型は、 'Microsoft.SqlServer.Types.dll'と 'Microsoft.SqlServer.Types.dll'の両方に存在します。

さて、私が実行して値を読み取るしようとしていますado.netを使用して:私は、この行にとVisual Studioのウォッチウィンドウにブレークポイントを追加した場合

protected SqlGeography MapSqlGeography(DbDataReader reader, string key) 
{ 
     return reader[key] is DBNull ? null : (SqlGeography)reader[key]; 
} 

は私が入力します。「キーリーダーを[奇妙な

(SqlGeography)reader[key] The type 'Microsoft.SqlServer.Types.SqlGeography' exists in both 
'Microsoft.SqlServer.Types.dll' and 
'Microsoft.SqlServer.Types.dll' 

メイン:私は、私は次のエラーを持っているキャストを作ってみるとすぐに、object {Microsoft.SqlServer.Types.SqlGeography}

しかし:]」、私は正しいポイントタイプの(XXXX、XXX)を見ることができます』事実はそれですDLLをTとこれまで私は、私はこれだけ名前空間/クラス名に対して1つの「ソース」を持って、それは重複してはならない....

マイ「usings」を知っている...まさに

同じです次のとおりです。

using Microsoft.SqlServer.Types; 
using System; 
using System.Collections.Generic; 
using System.Data.Common; 
using System.Data.SqlClient; 
using System.Threading.Tasks; 

これを解決する方法はありますか。ありがとう。

アップデート#1

私はNugetPackage `Microsoft.SqlServer.Types(空間)をアンインストール」と呼ばれる代わりに、1試してみました: 'Microsoft.SqlServer.Types(非公式)' をしても、すべての洗浄後以前のフォルダ/ファイルを削除して "bin/obj"をクリーンアップしても、まったく同じ例外が続きます。

私は今、感謝。

Cannot cast 'reader[key]' (which has an actual type of 'Microsoft.SqlServer.Types.SqlGeography') 
to 
'Microsoft.SqlServer.Types.SqlGeography' 
Microsoft.SqlServer.Types.SqlGeography 
+0

プロジェクトに含まれるDLLは何とか2回ありますか? –

+0

私はazure dbプロジェクトでこの問題を一度経験しました。これは、使用していたdllの無効なバージョンに関連していました。バージョンを比較し、正しいバージョンを使用していることを確認してください。 – Rafal

+1

同じアセンブリの異なる2つのバージョンへの参照があります。エイリアスを適用しないと、同じ名前空間内に同じ名前の型を含む複数のアセンブリに同じ名前空間の型を含めることができるため、システムは参照している特定の型を知る方法がありません。 (特に、同じアセンブリの2つの異なるバージョンがある場合は、同じ名前の型が含まれていることに驚くことではありません) –

答えて

0

ランタイムがアセンブリ参照を解決するには、次の手順を使用しています:

アップデート#2

ちょうどextern alias destination;

return reader[key] is DBNull 
     ? null 
     : (destination.Microsoft.SqlServer.Types.SqlGeography)reader[key]; 

を使用し、例外を持ってしようとした

  1. 適用可能な構成ファイル(アプリケーション構成ファイル、パブリッシャポリシーファイル、およびマシン構成ファイルなど)を調べて、正しいアセンブリバージョンを決定します。構成ファイルがリモート・マシン上にある場合、ランタイムは最初にアプリケーション構成ファイルを見つけてダウンロードする必要があります。
  2. アセンブリ名が以前にバインドされているかどうか確認し、存在する場合は、以前にロードされたアセンブリを使用します。
  3. グローバルアセンブリキャッシュをチェックします。そこにアセンブリがある場合、ランタイムはこのアセンブリを使用します。次の手順を使用してアセンブリのための
  4. プローブ:
    • 構成や発行者ポリシーは、元の参照に影響を与えていない場合は、バインド要求はアセンブリを使用して作成された場合。LoadFromメソッドでは、ランタイムは位置ヒントをチェックします。
    • 設定ファイルにコードベースがある場合、ランタイムはこの場所のみをチェックします。このプローブが失敗すると、ランタイムはバインディング要求が失敗したと判断し、他のプロービングは発生しません。
    • プロービングセクションに記載されているヒューリスティックを使用したアセンブリのプローブ。プロービング後にアセンブリが見つからない場合、ランタイムはWindowsインストーラにアセンブリの提供を要求します。これは、オンデマンドインストール機能として機能します。 注意強力な名前のないアセンブリのバージョンチェックや、厳密な名前のないアセンブリのグローバルアセンブリキャッシュのランタイムチェックはありません。今

、あなたが参照複数のアセンブリを(Damien_The_Unbelieverコメントで言ったように)持っているか、そのアセンブリのための特定のバージョンが設定されていないかどうかを確認します。

また、あなたがロードされます正確に何を見るためにAssembly Binding Log Viewer (Fuslogvw)を試すことができますし、検索パスは何ですか。

1

参照ライブラリがローカルにインストールされたものよりもNugetからMicrosoft.SqlServer.Typesの異なるバージョンが含まれているため、私は今日、このエラーが発生しました。

あなたはこの問題を解決するためにNugetを使用して、一致するバージョンをインストールすることができ、またはそれはオプションではありません場合は、バインディングリダイレクトを使用することができます。例えば

Install-Package Microsoft.SqlServer.Types -Version 10.50.1600.1 

あなたの依存関係のためpackage.jsonを見て、あなたの特定のバージョンを確認するか、おそらくあなたは直接DLLのプロパティを確認することができます。

関連する問題