InvalidCastException для объекта того же типа-загрузка пользовательского элемента управления
у меня очень проводная ошибка, один из моих пользовательских элементов управления, кажется, создает два скомпилированных файла, и когда я пытаюсь загрузить его динамически с LoadControl()
просто не удается, потому что не может бросить один на другой - даже если они точно такие же. Я пишу сообщение, чтобы увидеть, что все то же самое, только изменить скомпилированную dll.
System.Web.HttpUnhandledException (0x80004005):
Exception of type 'System.Web.HttpUnhandledException' was thrown. --->
System.InvalidCastException:
[A]ASP.Modules_OneProduct_MedioumImage cannot be cast to
[B]ASP.Modules_OneProduct_MedioumImage.
Type A originates from 'App_Web_kg4bazz1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
in the context 'Default'
at location 'C:WindowsMicrosoft.NETFramework64v4.0.30319Temporary ASP.NET Filesrooted7513eb08d9App_Web_kg4bazz1.dll'.
Type B originates from 'App_Web_oneproduct_mediumimage.ascx.d1003923.4xoxco7b, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
in the context 'Default'
at location 'C:WindowsMicrosoft.NETFramework64v4.0.30319Temporary ASP.NET Filesrooted7513eb08d9App_Web_oneproduct_mediumimage.ascx.d1003923.4xoxco7b.dll'.
код
это код, как это прямо сейчас после того, как я следую именно то, что написано на MSDN:
foreach (int OneProductID in TheProductIdArrays)
{
// here is the throw.
ASP.Modules_OneProduct_MedioumImage OneProduct =
(ASP.Modules_OneProduct_MedioumImage)LoadControl(@"~/mod/OneProduct_MediumImage.ascx");
// do some work with
//OneProduct
}
ранее я загрузил элемент управления без ASP.
но после появления этой ошибки и поиска решения я строго следую за тем, что находится на MSDN. Жучок все еще здесь, что бы я ни делал.
Я также попробовал оба этих метода, каждый в одиночку, и вместе (снова не удается)
<%@ Register src="~/mod/OneProduct_MediumImage.ascx" tagname="OneProduct_MediumImage" tagprefix="uc1" %>
<%@ Reference Control="~/mod/OneProduct_MediumImage.ascx" %>
Config
мой веб.config, я попробую с maxBatchSize
20, 100, 1000, а также с optimizeCompilations
true или false, но ошибка появляется снова.
<compilation debug="false" defaultLanguage="C#" batch="true"
maxBatchSize="800" batchTimeout="10800" optimizeCompilations="false"
targetFramework="4.0">
теперь некоторые подробности о
- ошибка случайна, в какой-то компиляции появляется, в какой-то другой нет.
- проект большой, страницы живут с большим количеством людей в каждую минуту, которые просят что-то увидеть, но также появляется, когда внутри никого нет.
- запускается на 64bit dot.net 4, интегрированный
- запустить как веб-сад, но также протестирован и один бассейн в одиночку (и получить то же самое выпуск)
- сеанс выключен для полного проекта.
- страницы запускаются с 2007 года, но эта проблема появляется в прошлом месяце, к сожалению, я не могу найти, где и как запускается, или что вызывает его, потому что я поздно несколько дней, чтобы увидеть его.
- появляется только один пользовательский элемент управления нагрузки, тот, который имеет тяжелый вызов.
- у меня есть изменение 4 раза код делает небольшие изменения или большие изменения и все еще там.
- я попробовал с
optimizeCompilations
true и false и та же проблема. - я попробовал также, остановив интернет, удалить все временные файлы, снова открыть, и снова.
- я пытаюсь разместить мьютекс на global.asax, когда приложение начинает блокировать только одну компиляцию в то время, но это также не удается.
- С того момента, как это работает, то все хорошо, но если не работает не автоматически исправлено.
- код, который я загружаю этот пользовательский элемент управления, существует и вызывается более чем одно место в коде, на разных страницах.
- другие пользовательские элементы управления с аналогичной нагрузкой не имели никаких проблем.
- ViewState отключен для этого пользовательского элемента управления.
- я также пытаюсь переместить некоторый код, изменить полный вызов функции с микро оптимизирует, снова не терпит неудачу.
-
отлично работает на компьютере разработки. I местоbatch="true"
на веб.config и ошибка появляется сразу. - нет других такие проблемы, как ошибка, которую мы не можем исправить, несмотря ни на что. Система работает в течение нескольких дней, пул не перерабатывается вообще, память стабильна, и есть больше свободного использования. Программа работает уже много лет, но мы меняемся почти каждый день с обновлениями.
- под одним и тем же основным кодом работает несколько сайтов (что-то вроде stackexchange), и все они имеют одну и ту же случайную проблему.
- AutoEventWireup является false
- его появляется и на других пользовательских контролируйте, что я загружаю так же.
что я делаю сейчас, как обходной путь, когда эта ошибка появляется: я просто заставляю проект перекомпилировать с небольшим изменением, и ошибка уходит, до следующего обновления.
у меня есть ошибка, которая пытается решить последние недели дерева без поиска причины. Я попробовал почти все, что могу, но все терпит неудачу, и ошибка появляется снова. Поэтому я публикую здесь, возможно, некоторые могут помочь мне и найти выход из этого.
последнее слово: Эта ошибка сумасшедшая, пользовательский элемент управления тот же, я делаю что - нибудь на нем я только загружаю его динамически и бум, компилятор имеет его два раза по какой-то причине, что только он знает-случайно.
обновление 1
я смог воспроизвести ошибку на машине разработчика. Там я обнаруживаю, что два dll-модуля, содержащие этот пользовательский элемент управления, имеют разные.
один был связкой из 4 пользовательских элементов управления вместе. Другим модулем был только пользовательский контроль.
решение
после дерева недель, пытаясь исправить эту ошибку, я заканчиваю тем, что эта ошибка появляется, когда компилятор делает пакетную компиляцию каталога и связывает много разных пользовательских элементов управления в той же dll. Поэтому, когда я пытаюсь загрузить его в одиночку, это исключение.
поэтому я перемещаю проблемный пользовательский элемент управления в другой каталог и, похоже, пока избегаю его.
обновление 2
появляется опять же, даже после перемещения некоторых файлов в другой каталог. Является случайным и не может найти четкой связи с тем, что вызывает его.
обновление 3
потому что у нас есть место, что основной проблемой здесь является пакетная компиляция (batch="true"
), который компилирует на той же dll много пользовательских элементов управления, один из способов сказать компилятору, чтобы не делать этого, является maxBatchGeneratedFileSize
. Я использую его со значением 100, и проблема появляется снова, теперь я понизил его до 40 и проверить его.
maxBatchGeneratedFileSize="40"
5 ответов
Это может произойти, когда вы включили пакетирование и имеете некоторую форму круговых ссылок на уровне каталога.
смотрите ответ чтобы точно понять, что я имею в виду под "круговыми ссылками" в этом контексте, поскольку смысл довольно тонкий.
Если вам удастся разорвать цикл (например, переместив пользовательский элемент управления в другое место), вы не нажмете эту проблему.
обновление 1
Я бы подумал, что в теории это может быть только вызвано циклом, но иногда их трудно обнаружить.
Я дам вам альтернативное решение, которое, я думаю, будет работать и очень легко попробовать (хотя это немного взломать). В пользовательском элементе управления, который дает вам проблемы, добавьте следующий атрибут в директиве:
<%@ Control Language="C#" [...] CompilerOptions="/define:dummy1" %>
Если вы видите это с некоторыми другими элементами управления, вы можете добавить то же самое, но с dummy2, dummy3, и т. д...
Это будет иметь эффект не дозируя этот пользовательский контроль, поскольку он имеет разные потребности в компиляции от других. Технически вы можете добавить любую часть командной строки C# в качестве CompilerOptions
, но манекен /define
является самым простым и безвредным.
но в отличие от отключения дозирования глобально, влияние perf будет минимальным, так как только очень небольшое подмножество страниц не будет дозироваться.
кстати, само собой разумеется, что то, что вы видите, является ошибкой в ASP.NET, и эта ошибка была там, вероятно, 10+ лет! Может быть, в какой-то момент он должен вам решать :)
чтобы отслеживать причину проблемы, я считаю, что важно знать, как был создан ваш контроль. Пожалуйста, обратитесь к этому чтению:поворот .ascx и контроль пользователей в распространяемый настраиваемый элемент управления.
Шаг 1: создание пользовательского элемента управления
чтобы создать пользовательский элемент управления, лучше всего начать с пустого приложения, которое не содержит ничего, кроме ascx. Пока авторство пользователя контролируемое использование "стандартные" методы, есть некоторые ограничения, которые вы должны быть в курсе для того, чтобы он был успешно превращен в отдельный пользовательский элемент управления. основное ограничение заключается в том, что пользовательский контроль должен быть автономным. То есть, он не может зависеть от глобальных вещей app как App_Code или global.асакс. Причина этого в том, что цель состоит в том, чтобы превратить UserControl в автономную DLL,это перерыв в других приложениях, если он полагался на код, который не является частью этого Dll файлы. Одним исключением из этого правила является то, что UserControl может быть зависит от сборок, которые находятся в каталоге bin (или в ГЛОБАЛЬНЫЙ КЭШ СБОРОК.) Вы просто должны убедиться, что другие сборки всегда доступно при использовании пользовательского элемента управления в другом приложении.
и
Шаг 3: используйте команду опубликовать для предварительной компиляции сайта
(...) Выберите " Использовать фиксированное именование и одну страницу заседания Ассамблеи." этот гарантирует, что ваш пользовательский элемент управления будет скомпилирован в один сборка, которая будет иметь имя, основанное на файле ascx. Если нет ... проверьте этот параметр, ваш пользовательский элемент управления может быть скомпилирован вместе с другие страницы и пользовательские элементы управления (если они у вас были), а также сборка получил бы случайное имя, с которым было бы сложнее работать.
на мой взгляд, очень вероятно, что у вас есть пользовательский элемент управления, скомпилированный и зарегистрирован в GAC как отдельная сборка, а также включен в библиотеку DLL веб-приложения.
Примечание: возможно, это должен был быть комментарий, но я хотел включить цитаты из вышеупомянутой ссылки. Надеюсь, это поможет.
после большой отладки на обновленном ASP.NET сайт, Моя последняя ошибка была в runtime.
Я только что проверил опцию сборки / публикации "использовать фиксированные именования и одностраничные сборки", и это решило мой случай:)
вот некоторые полезные ссылки: https://msdn.microsoft.com/en-us/library/hh475319 (v=против 110).aspx
недавно я столкнулся с подобной проблемой, когда я компилировал измененную версию asp.net MVC 4 и импорт новой DLL в проект.
Как-то я ссылался на старые версии DLL в интернете.настроек (в том числе в интернете.config в папке views)
ошибка в моем случае была вызвана тем, что две библиотеки были разными версиями. 4.0.0 и 4.1.0. Может, тебе стоит этим заняться. Возможно, укажите версию скомпилированных файлов (я предполагаю Dll)
Я надеюсь, что это поможет вам решить проблему.
прочие советы: я предполагаю, что у вас есть какая-нибудь система контроля версий? если да, верните все изменения до начала работы и внимательно посмотрите на код, какие модели / элементы управления изменяются и как. если вы не используете VCS... вы мало что можете сделать, чтобы вернуть изменения. И вы должны начать использовать VCS.
Я заметил, что иногда дизайнер создает второй файл конструктора CodeBehind, например, у вас будет:
OneProduct_MediumImage.ascx
OneProduct_MediumImage.ascx.cs
OneProduct_MediumImage.ascx.designer.cs
OneProduct_MediumImage.ascx.designer1.cs
вы не заметите, если у вас нет опции" показать все файлы " в наборе обозревателя решений, но для веб-проекта компилятор скомпилирует все файлы в папке, а не только те, которые включены в проект.
во-вторых, если ваш проект является "проектом веб-сайта", нет пространств имен, что может привести ко многим странным ошибкам. Посмотрите на этот вопрос SO: проблема пространства имен .net
наконец, мне удалось решить кажущиеся случайные ошибки UserControl, установив ClassName
атрибут в файле управления, например:
<%@ Control Language="cs"
AutoEventWireup="false"
CodeBehind="OneProduct_MediumImage.ascx.cs"
Inherits="ASP.Modules_OneProduct_MedioumImage"
ClassName="OneProduct_MediumImageControl" %>