InvalidCastException für Objekt desselben Typs - Benutzerdefinierte Steuerelementladung

Ich habe einen sehr verkabelten Fehler, eines meiner benutzerdefinierten Steuerelemente scheint zwei kompilierte Dateien zu erstellen, und wenn ich versuche, es dynamisch mit zu ladenLoadControl() ist einfach scheitern, weil man nicht die einen auf die anderen werfen kann - auch wenn sie genau gleich sind. Ich schreibe die Nachricht, um zu sehen, dass alles gleich ist, ist nur die kompilierte DLL zu ändern.

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'.
Der Code

Dies ist der Code, wie er jetzt ist, nachdem ich ihm gefolgt bingenau das, was auf MSDN geschrieben steht:

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
}

Bisher habe ich das Steuerelement ohne das geladenASP. Aber nachdem dieser Fehler aufgetreten ist und ich nach einer Lösung gesucht habe, befolge ich genau die Anweisungen auf MSDN. Der Bug ist immer noch da, egal was ich tue.

Ich habe auch beide dieser Methoden ausprobiert, jede für sich und zusammen (wieder scheitern)

<%@ Register src="~/mod/OneProduct_MediumImage.ascx" tagname="OneProduct_MediumImage" tagprefix="uc1" %>
<%@ Reference Control="~/mod/OneProduct_MediumImage.ascx" %>
Konfig

Meine web.config habe ich mit probiertmaxBatchSize 20, 100, 1000, auch mitoptimizeCompilations true oder false, aber der Fehler wird erneut angezeigt.

<compilation debug="false" defaultLanguage="C#" batch="true"
maxBatchSize="800" batchTimeout="10800" optimizeCompilations="false"
targetFramework="4.0">
Nun einige Details zuDer Fehler ist zufällig, in einigen Kompilierungen erscheint er, in anderen nicht.Das Projekt ist ein großes, die Seiten sind in jeder Minute mit vielen Leuten live, die nach etwas fragen, aber auch erscheinen, wenn niemand drinnen ist.Läuft auf 64bit dot.net 4, IntergratedLäuft als Webgarten aber auch getestet und ein Pool alleine (und bekommt das selbe Problem)Die Sitzung ist für das gesamte Projekt deaktiviert.Die Seiten sind von 2007, aber diese Ausgabe erscheint im letzten Monat, leider kann ich nicht finden, wo und wie gestartet wird, oder was es auslöst, weil ich einige Tage zu spät komme, um es zu sehen.Es wird nur ein benutzerdefiniertes Steuerelement geladen, das über einen hohen Anruf verfügt.Ich habe den Code viermal geändert und kleine oder große Änderungen vorgenommen.Ich habe es mit versuchtoptimizeCompilations wahr und falsch und das gleiche Problem.Ich habe auch versucht, das Web zu stoppen, alle temporären Dateien zu löschen, wieder zu öffnen, und es gab wieder.Ich habe versucht, einen Mutex in global.asax zu platzieren, wenn die Anwendung nur eine Kompilierung gleichzeitig sperrt, dies schlägt jedoch ebenfalls fehl.Ab dem Moment, in dem das funktioniert, ist alles in Ordnung, aber wenn es nicht funktioniert, wird es nicht automatisch korrigiert.Der Code, den ich dieses benutzerdefinierte Steuerelement lade, ist vorhanden und wird an mehreren Stellen im Code auf verschiedenen Seiten aufgerufen.Andere benutzerdefinierte Steuerelemente mit ähnlicher Last hatten keine Probleme.ViewState ist für dieses benutzerdefinierte Steuerelement deaktiviert.Ich habe auch versucht, etwas Code zu verlagern, den vollen Funktionsaufruf mit Mikro zu optimieren, nicht wieder fehlzuschlagen.Funktioniert einwandfrei auf Entwicklungscomputern. Ich legebatch="true" auf web.config und der Fehler erscheint sofort.Es gibt keine anderen Probleme, wie einen Fehler, den wir nicht beheben können, egal was passiert. Das System wird tagelang betrieben, der Pool wird NICHT recycelt, der Speicher ist stabil und es steht mehr zur Verfügung. Das Programm läuft seit Jahren, aber wir ändern uns fast jeden Tag mit Updates.Unter dem gleichen Kerncode laufen mehr als eine Site (so etwas wie StackExchange) und alle haben das gleiche zufällige Problem.Das AutoEventWireup ist falschEs erscheint und auf anderen benutzerdefinierten Steuerelementen, die ich auf die gleiche Weise lade.

Was ich jetzt als Workaround mache, wenn dieser Fehler auftritt: Ich zwinge das Projekt einfach dazu, mit einer kleinen Änderung neu zu kompilieren, und der Fehler wird bis zum nächsten Update behoben.

Ich habe einen Fehler, der versucht, die letzten Baumwochen zu lösen, ohne den Grund zu finden. Ich habe fast alles versucht, was ich kann, aber alles schlägt fehl, und der Fehler tritt erneut auf. Also poste ich hier vielleicht können mir einige helfen und einen Ausweg finden.

Letztes Wort: Dieser Fehler ist verrückt, das benutzerdefinierte Steuerelement ist das gleiche, ich mache alles daran, ich lade es nur dynamisch und boom, der Compiler hat es zwei verschiedene Male aus irgendeinem Grund, den nur er kennt - zufällig.

Update 1

Ich konnte den Fehler auf der Entwicklermaschine reproduzieren. Dort stelle ich fest, dass die beiden DLL-Module, die dieses benutzerdefinierte Steuerelement enthalten, ein anderes haben.

Das eine war ein Bündel von 4 benutzerdefinierten Steuerelementen zusammen. Das andere Modul war das benutzerdefinierte Steuerelement.

Umgehung

Nach drei Wochen, in denen ich versucht habe, diesen Fehler zu beheben, wird dieser Fehler angezeigt, wenn der Compiler die Stapelkompilierung eines Verzeichnisses durchführt und viele verschiedene benutzerdefinierte Steuerelemente in derselben DLL bündelt. Wenn ich also versuche, es alleine zu laden, wird diese Ausnahme ausgelöst.

Daher verschiebe ich das problematische benutzerdefinierte Steuerelement allein in ein anderes Verzeichnis und meide es anscheinend vorerst.

Update 2

Erscheint wieder, auch nachdem ich einige Dateien in ein anderes Verzeichnis verschoben habe. Ist zufällig und kann keinen eindeutigen Zusammenhang mit dem finden, was seine auslöst.

Update 3

Weil wir vor Ort haben, dass das Hauptproblem hier die Stapelkompilierung ist (batch="true"), die auf derselben DLL viele benutzerdefinierte Steuerelemente kompiliert, eine Möglichkeit, dem Compiler mitzuteilen, dies NICHT zu tun, ist diemaxBatchGeneratedFileSize Parameter. Ich benutze es mit einem Wert von 100, und das Problem wird erneut angezeigt. Jetzt habe ich es auf 40 gesenkt und teste es.

maxBatchGeneratedFileSize="40"

Antworten auf die Frage(5)

Ihre Antwort auf die Frage