C # Тип A не может быть приведен к типу B (InvalidCastException) ... Контекст ад? - PullRequest
9 голосов
/ 08 ноября 2010

У меня очень неприятная проблема с моим веб-приложением.

Приложение спроектировано следующим образом:
- корневое приложение загружает Flex SWF, который, в свою очередь, загружает Flex SWF стороннего производителя.модуль во вспомогательном приложении ( MagickECB ).
- Ссылка на оба приложения Albums.dll , dll найдена в / bin и / MagickECB /bin и оба приложения совместно используют один и тот же пул приложений в IIS.

EDIT : это два проекта, проект корневого приложения и проект subapp.Ссылка на проект подпроекта корневого приложения.

При загрузке гибкого модуля подприложения из гибкого приложения корневого приложения мы случайным образом получаем ошибку приведения следующим образом:

Произошла ошибка при полученииконфигурация фотокниги: [A] Albums.LocalizationConfiguration не может быть преобразована в [B] Albums.LocalizationConfiguration.Тип A происходит от 'Albums, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null' в контексте ' По умолчанию ' в местоположении ' C: \ WINDOWS \ Microsoft.NET \ Framework \v2.0.50727 \ Временные файлы ASP.NET \ magickecb \ 4414db97 \ 126f5aaf \ assembly \ dl3 \ cf281292 \ 4a6ecec8_8a7bcb01 \ Albums.DLL '.Тип B происходит от 'Albums, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null' в контексте ' LoadFrom ' в местоположении ' C: \ WINDOWS \ Microsoft.NET \ Framework \v2.0.50727 \ Временные файлы ASP.NET \ magickecb \ 4414db97 \ 126f5aaf \ assembly \ dl3 \ 017fab88 \ a91238d1_7977cb01 \ Albums.dll '.в Albums.LocalizationConfiguration.GetConfig () в Albums.CGlobal.GetUserLocale (String userHandle)

Пытаясь исследовать эту проблему, я обнаружил метод GetConfig, вызывающий ошибку приведения, возвращаемую

return (LocalizationConfiguration)ConfigurationManager.GetSection("Localization/Localization");

Раздел в файле Web.config объявлен следующим образом: ( EDIT : web.config корневого приложения)

<sectionGroup name="Localization"> 
    <section name="Localization" type="Albums.LocalizationConfigurationHandler, Albums"/>
</sectionGroup>

Я полагаю, что внутренний код GetSection пытаетсязагрузить Albums.dll в контексте «LoadFrom» и, следовательно, вызвать конфликт с исходным файлом Albums.dll, загруженным в путь / bin ( см. проблематика контекста )

Также отмечу, что другиеdll в / MagickECB / Bin также ссылается на Albums.dll, поэтому я перестраиваю все проекты так, чтобы каждая DLL ссылалась на одну и ту же версию Albums.dll

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

Буду признателен за любую информацию о том, как решить эту проблему !!

Ответы [ 2 ]

10 голосов
/ 08 ноября 2010

Дважды проверьте ваши ссылки, если вы сравниваете ваши два местоположения DLL, они отличаются (расширение верхнего регистра против строчного не проблема):

Временные файлы ASP.NET \ magickecb \ 4414db97 \ 126f5aaf \ Assembly \ dl3 \ cf281292 \ 4a6ecec8_8a7bcb01 \ Albums.DLL

Временные файлы ASP.NET \ magickecb \ 4414db97 \ 126f5aaf \ Assembly \ dl3 \ 017fab88 \ a91238d1_7977cb01 \ Albums.dll

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

РЕДАКТИРОВАТЬ: __AssemblyInfo__.ini файл в вышеуказанных папках даст вам путь, из которого был скопирован Albums.dll.

0 голосов
/ 08 ноября 2010

Без объяснения вашей проблемы я бы предложил зарегистрировать сборку в GAC и использовать ее оттуда.

...