C #; При приведении к тому же классу, который пришел из другой сборки - PullRequest
2 голосов
/ 13 июня 2010

Для полного разделения / развязки я реализовал DAL в сборке, которая просто копируется через событие после сборки в папку BIN веб-сайта.Затем на веб-сайте Application Start загружается эта сборка через System.Reflection.Assembly.LoadFile.Опять же, используя отражение, я создаю пару экземпляров из классов в этой сборке.Затем я сохраняю ссылку на эти экземпляры в сеансе (HttpContext.Current.Items)

Позже, когда я пытаюсь получить объект, сохраненный в сеансе, я не могу привести их к их собственным типам (изначально пробовал интерфейсы, но для отладки пытался привести их к собственным типам), получая эту ошибку:

 [A]DAL_QSYSCamper.NHibernateSessionBuilder cannot be cast to [B]
DAL_QSYSCamper.NHibernateSessionBuilder. Type A originates from 'DAL_QSYSCamper, 
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' at 
location 'C:\Users\myusername\AppData\Local\Temp\Temporary ASP.NET 
Files\root\ad6e8bff\70fa2384\assembly\dl3\aaf7a5b0\84f01b09_b10acb01\DAL_QSYSCamper.DLL'. 
Type B originates from 'DAL_QSYSCamper, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=null' in the context 'LoadNeither' at 
location 'C:\Users\myusername\Documents\Projects\QSYS\Deleteme\UI\MVCClient\bin\DAL_QSYSCa
mper.DLL'.

Это происходит при отладке в VS - VS удается остановить в исходном проекте DAL, хотя язагружен из сборки, и проект не ссылается на проект веб-сайта (они оба находятся в решении).

Я понимаю ошибку, но не понимаю, как и почему выполняется сборкаиспользуется / загружается из двух мест - я загружаю его только один раз из файла, и нет ссылки на проект.

Следует отметить, что я также использую Windsor для DI.Объект, который пытается извлечь объект из сеанса, - это A) из класса из этой сборки DAL;Б) вводится в класс веб-сайта Виндзор.Я буду работать над добавлением примера кода к этому вопросу, но хотел бы выложить его на тот случай, если станет очевидно, что я делаю неправильно.

Ответы [ 2 ]

7 голосов
/ 13 июня 2010

Причина указана в разделе «Примечания» метода Assembly.LoadFile ():

Используйте метод LoadFile для загрузки и проверки сборок, имеющих одинаковые идентификаторы, но расположенных по разным путям.,LoadFile не загружает файлы в контекст LoadFrom и не разрешает зависимости, используя путь загрузки, как это делает метод LoadFrom.LoadFile полезен в этом ограниченном сценарии, потому что LoadFrom не может использоваться для загрузки сборок, которые имеют одинаковые идентификаторы, но разные пути;он загрузит только первую такую ​​сборку.

Возможно, это немного плотно.Контекст загрузки сборки - сложная тема, о которой подробно рассказывает Сюзанна Кук.В конечном итоге, когда вы используете типы этой сборки в другом месте, вы снова загрузите сборку , и эти типы не будут совпадать с типами из сборки LoadFile, так как сборки имеют разные идентификаторы.

Как указано, используйте Load или LoadFrom, чтобы избежать этой проблемы.

1 голос
/ 13 июня 2010

Если я не понял что-то в вашем вопросе, определение, приведение к тому же классу из другой сборки, НЕ приведение к тому же классу.Assembly1.Class <> Assembly2.Class, даже если элементы / методы / интерфейсы и свойства одинаковы.

Единственный способ, которым такое «приведение» будет успешным (насколько мне известно), - это сериализация.Убедитесь, что в вашем проекте, когда вы ссылаетесь на любую сборку, для которой вы хотите ее привести, ссылка на то же место, а также удаляет любой дублированный объектный код и размещает его в одном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...