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

https://msdn.microsoft.com/en-us/library/aa479044.aspx

http://forums.asp.net/t/960707.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" %>