2016-12-02 2 views
2

В моей библиотеке классов Windows (потребляемой веб-сайтом MVC) у меня есть установлен NugetPackage Microsoft.SqlServer.Types (Spatial).Тип «Microsoft.SqlServer.Types.SqlGeography» существует как в «Microsoft.SqlServer.Types.dll», так и «Microsoft.SqlServer.Types.dll»

Теперь, используя ADO.NET Я пытаюсь прочитать значение, выполнив:

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

Если добавить тормозную точку в этой линии и в визуальном окне студии часы я типа: «читателя [ключ ]», я могу видеть правильную точку (XXXX, XXX) типа:„object {Microsoft.SqlServer.Types.SqlGeography}

Но, как только я пытаюсь сделать бросок у меня есть следующая ошибка:

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

Main странно факт та Тл библиотеки являются точно так же ...

Насколько я знаю, у меня есть только один «источник» для этого имени пространства имен/класса, он не должен быть повторен ....

Моим «usings» являются:

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

Любые идеи о том, как это решить? Благодарю.

Update # 1

Я удалил NugetPackage `Microsoft.SqlServer.Types (Spatial)» и вместо этого попробовал один под названием: 'Microsoft.SqlServer.Types (Unofficial)' и даже после очистки все предыдущие папки/файлы, а также очистка «bin/obj», я продолжаю иметь то же самое исключение ....

Я просто сейчас вижу причину этого сейчас .... любые идеи были бы действительно оценили.

Update # 2

Просто пытался использовать extern alias destination;

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

И есть исключение:

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 включенным в ваш проект дважды как-то? –

+0

У меня была эта проблема однажды в проекте azure db, и это было связано с неверной версией этой DLL, которую я использовал. Сравните версии и убедитесь, что вы используете правильный. – Rafal

+1

У вас есть ссылки на две разные версии одной и той же сборки. Без применения псевдонимов система не имеет способа узнать, к какому конкретному типу (типам) вы обращаетесь, поскольку множественные сборки могут содержать типы из тех же пространств имен, включая типы с одинаковыми именами в пределах тех же пространств имен. (Тем более, что здесь, где у вас есть две разные версии одной и той же сборки, не удивительно, что они содержат типы одинаковых имен) –

ответ

0

Среда выполнения использует следующие шаги для разрешения ссылки на сборку:

  1. Определяет правильную версию сборки, изучая соответствующие файлы конфигурации, включая файл конфигурации приложения, файл политики издателя и файл конфигурации машины. Если файл конфигурации находится на удаленном компьютере, среда выполнения должна сначала найти и загрузить файл конфигурации приложения.
  2. Проверяет, связано ли имя сборки раньше и, если да, использует ранее загруженную сборку.
  3. Проверяет глобальный кеш сборки. Если сборка найдена там, среда выполнения использует эту сборку.
  4. Зонды для сборки, используя следующие шаги:
    • Если конфигурация и политик издателя не влияют на первоначальную ссылку и если запрос привязки был создан при Ассамблее.LoadFrom, среда выполнения проверяет подсказки местоположения.
    • Если в файлах конфигурации обнаружена кодовая база, среда выполнения проверяет только это местоположение. Если этот пробник выходит из строя, среда выполнения определяет, что запрос привязки не прошел, и никакое другое зондирование не происходит.
    • Зонды для сборки с использованием эвристик, описанных в разделе зондирования. Если сборка не найдена после проверки, среда выполнения запрашивает установщик Windows для обеспечения сборки. Это действует как функция установки по требованию. Примечание. Нет проверки версий для сборок без сильных имен, а также проверка времени выполнения в глобальном кеше сборок для сборок без сильных имен.

Теперь, проверьте, чтобы увидеть, если у вас есть несколько узлов, на которые ссылается (как сказал Damien_The_Unbeliever в комментарии) или не имеют определенный набор версий для этой сборки.

Также вы можете попробовать Assembly Binding Log Viewer (Fuslogvw), чтобы увидеть, что именно загружается и каковы пути поиска.

1

Сегодня я столкнулся с этой ошибкой, потому что в справочной библиотеке была добавлена ​​другая версия Microsoft.SqlServer.Types от Nuget, чем локально установленная.

Вы можете установить подходящую версию с помощью Nuget для решения проблемы, или вы можете использовать переадресацию привязки, если это не вариант.

Например:

Install-Package Microsoft.SqlServer.Types -Version 10.50.1600.1 

Проверьте свои конкретные версии, глядя на package.json для зависимостей, или, возможно, вы можете проверить свойства DLL непосредственно.

Смежные вопросы