InvalidCastException dla obiektu tego samego typu - niestandardowe obciążenie kontrolne
Mam bardzo okablowany błąd, wydaje się, że jedno z moich niestandardowych elementów sterujących tworzy dwa skompilowane pliki i gdy próbuję załadować je dynamicznie za pomocąLoadControl()
jest po prostu nieudany, ponieważ nie może rzucić jednego na drugiego - nawet jeśli są dokładnie takie same. Piszę wiadomość, aby zobaczyć, że wszystko jest takie samo, tylko zmienić skompilowaną bibliotekę 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:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\80ed7513\10eb08d9\App_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:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\80ed7513\10eb08d9\App_Web_oneproduct_mediumimage.ascx.d1003923.4xoxco7b.dll'.
KodTo jest taki kod, jaki jest teraz po tym, jak go śledzędokładnie to, co jest napisane w 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
}
Wcześniej załadowałem kontrolę bezASP.
ale po pojawieniu się tego błędu i szukaniu rozwiązania, ściśle przestrzegam tego, co jest w MSDN. Błąd jest nadal tutaj, niezależnie od tego, co zrobię.
Wypróbowałem również obie te metody, każdą pojedynczo i razem (znów nie)
<%@ Register src="~/mod/OneProduct_MediumImage.ascx" tagname="OneProduct_MediumImage" tagprefix="uc1" %>
<%@ Reference Control="~/mod/OneProduct_MediumImage.ascx" %>
KonfigMój web.config, z którym próbowałemmaxBatchSize
20, 100, 1000, także zoptimizeCompilations
prawda lub fałsz, ale błąd pojawia się ponownie.
<compilation debug="false" defaultLanguage="C#" batch="true"
maxBatchSize="800" batchTimeout="10800" optimizeCompilations="false"
targetFramework="4.0">
Teraz kilka szczegółów na tematBłąd jest przypadkowy, w niektórych pojawia się kompilacja, w innych nie.Projekt jest duży, strony są na żywo z wieloma ludźmi w każdej minucie, które proszą o zobaczenie czegoś, ale pojawiają się również, gdy nikogo nie ma w środku.Jest uruchamiany na 64-bitowym dot.net 4, zintegrowanymUruchom jako ogród sieciowy, ale także testowany i jedna pula sama (i otrzymaj ten sam problem)Sesja jest wyłączona w pełnym projekcie.Strony są uruchamiane od 2007 roku, ale ten problem pojawia się w zeszłym miesiącu, niestety nie mogę znaleźć gdzie i jak się uruchamia, ani co go uruchamia, ponieważ spóźniam się kilka dni, aby go zobaczyć.Pojawia się tylko jeden niestandardowy ładunek kontrolny, który ma ciężkie połączenia.Zmieniłem 4 razy kod, wprowadzając małe zmiany lub duże zmiany i wciąż tam.Próbowałem zoptimizeCompilations
prawda i fałsz oraz ten sam problem.Próbowałem także zatrzymać sieć, usunąć wszystkie pliki tymczasowe, otworzyć ponownie i ponownie.Próbowałem umieścić mutex na global.asax, gdy aplikacja zaczyna blokować tylko jedną kompilację w tym czasie, ale to również nie powiedzie się.Od momentu, w którym działa, wszystko jest dobre, ale jeśli nie działa, nie jest automatycznie korygowane.Kod, który ładuję ten niestandardowy formant, istnieje i jest wywoływany w więcej niż jednym miejscu kodu, na różnych stronach.Inne niestandardowe kontrolki o podobnym obciążeniu nie miały żadnych problemów.ViewState jest wyłączony dla tego niestandardowego formantu.Próbuję też przenieść jakiś kod, zmienić pełne wywołanie funkcji za pomocą mikrooptymalizacji, nigdy więcej nie zawiodę.Działa dobrze na komputerze programistycznym. Ja kładębatch="true"
na web.config, a błąd pojawia się od razu.Nie ma innych takich problemów, jak błąd, którego nie możemy naprawić bez względu na wszystko. System działa przez kilka dni, pula NIE jest w ogóle przetwarzana, pamięć jest stabilna, a korzystanie z niej jest bardziej bezpłatne. Program działa już od lat, ale zmieniamy się prawie codziennie z aktualizacjami.W ramach tego samego kodu podstawowego działa więcej niż jedna witryna (coś takiego jak stackexchange) i wszystkie mają ten sam losowy problem.AutoEventWireup jest fałszywePojawia się i na innej niestandardowej kontroli ładuję w ten sam sposób.Co robię teraz jako obejście, gdy pojawia się ten błąd: po prostu wymuszam rekompilację projektu z małą zmianą, a błąd zniknie, aż do następnej aktualizacji.
Mam błąd, który próbuje rozwiązać ostatnie tygodnie drzewa bez znalezienia przyczyny. Próbowałem prawie wszystkiego, co mogę, ale wszystkie zawiodły, a błąd pojawia się ponownie. Więc zamieszczam tutaj może niektórzy mogą mi pomóc i znaleźć wyjście z tego.
Ostatnie słowo: ten błąd jest szalony, kontrola niestandardowa jest taka sama, robię na niej wszystko, ładuję ją tylko dynamicznie i boom, kompilator ma dwa różne czasy z jakiegoś powodu, który tylko on wie - losowo.
Aktualizacja 1Udało mi się odtworzyć błąd na komputerze programisty. Tam odkryłem, że dwa moduły dll, które zawierają tę kontrolę niestandardową, mają inne.
Jeden był pakietem 4 kontrolek niestandardowych razem. Drugim modułem była sama kontrola niestandardowa.
Obejście problemuPo kilku tygodniach próby naprawienia tego błędu kończę, że ten błąd pojawia się, gdy kompilator tworzy kompilację wsadową katalogu i pakuje wiele różnych niestandardowych kontrolek w tej samej dll. Więc gdy próbuję załadować go sam, wyrzucam ten wyjątek.
Dlatego przenoszę problematyczną kontrolę niestandardową w innym katalogu i wydaje mi się, że na razie go unikam.
Aktualizacja 2Pojawia się ponownie, nawet po przeniesieniu niektórych plików do innego katalogu. Jest losowy i nie może znaleźć jasnego związku z tym, co jest wyzwalane.
Aktualizacja 3Ponieważ wiemy, że głównym problemem jest kompilacja wsadowa (batch="true"
), który kompiluje na tej samej dll wiele niestandardowych formantów, jednym ze sposobów powiedzenia kompilatorowi, aby tego NIE robić, jestmaxBatchGeneratedFileSize
parametr. Używam go z wartością 100, a problem pojawia się ponownie, teraz obniżyłem go do 40 i przetestuję.
maxBatchGeneratedFileSize="40"