Freitag, Februar 21, 2020

C# – Typ A kann nicht gegossen werden zu Typ B ( InvalidCastException)… Kontext Hölle?

Ich habe ein sehr unangenehmes Problem mit meiner webapp.

Die app ist so konzipiert wie folgt :

– Die root-App ist das laden einer Flex SWF, das wiederum lädt ein 3rd-party-Flex-SWF-Modul in einer sub-app (MagickECB).

– Beide Apps Referenz Albums.dll, dll gefunden in /bin und /MagickECB/bin und beide Apps haben den gleichen Anwendungspool in IIS.

BEARBEITEN : Das sind zwei Projekte, die root-app-Projekt und die subapp-Projekt. Subapp Projekt-Referenz root-app-Projekt.

Beim laden der sub-app-flex-Modul aus dem root-app flex-Anwendung, die wir zufällig bekommen, ein cast-Fehler wie folgt :

Es wurde ein Fehler bekommen
die Konfiguration des Fotobuchs:
[A]Alben.LocalizationConfiguration
kann nicht umgewandelt werden
[B] – Alben.LocalizationConfiguration.
Typ A entsteht aus ‚Alben
Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null “ im Kontext
Standard‚ an Position
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary
ASP.NET
Dateien\magickecb\4414db97\126f5aaf\assembly\dl3\cf281292\4a6ecec8_8a7bcb01\Albums.DLL
‚.
Typ B stammt aus “ die Alben,
Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null “ im Kontext
LoadFrom‚ an Position
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary
ASP.NET
Dateien\magickecb\4414db97\126f5aaf\assembly\dl3\017fab88\a91238d1_7977cb01\Albums.dll
‚.
bei
Alben.LocalizationConfiguration.GetConfig()
bei Alben.CGlobal.GetUserLocale(String
userHandle)

Versuchen, dieses Problem zu untersuchen, fand ich heraus, das GetConfig-Methode verursacht die cast-Fehler zurückgegeben

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

Den Abschnitt in der Web.config deklariert ist wie folgt : (BEARBEITEN : root-app ‚ s web.config)

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

Meine Vermutung wäre, dass der interne code der GetSection-versucht zu laden Albums.dll in der „LoadFrom“ Kontext und sind daher zu einem Konflikt mit den original Albums.dll geladen in den /bin-Pfad (siehe Kontext-Problematik)

Ich auch beachten Sie, dass andere dlls in /MagickECB/Bin auch Referenz-Albums.dll also ich Baue alle Projekte, so dass sich jede DLL-Verweis die gleiche version von Albums.dll

Letzte, wenn Sie die dll-vollständigen Pfad in Temporären Dateien, die Erweiterungen sind verschiedene (groß-vs. Kleinschreibung)..

Alle Eingaben auf, wie dieses problem zu lösen, wäre sehr dankbar !!

InformationsquelleAutor Breakdown | 2010-11-08

2 Kommentare

  1. 10

    Überprüfen Sie Ihre Referenzen, wenn Sie sich den Vergleich der beiden dll Orten, die Sie unterschiedlich sind (Erweiterung der Großschreibung vs. Kleinschreibung ist kein Problem):

    Temporäre ASP.NET Dateien\magickecb\4414db97\126f5aaf\assembly\dl3\ cf281292\4a6ecec8_8a7bcb01 \Albums.DLL

    Temporäre ASP.NET Dateien\magickecb\4414db97\126f5aaf\assembly\dl3\ 017fab88\a91238d1_7977cb01 \Albums.dll

    Wahrscheinlich bedeutet, dass Sie verweisen auf zwei verschiedene Dateien – vielleicht auf eine, wie ein Projekt und die anderen direkt als Datei. Hast du irgendwelche Warnungen, wenn Sie versuchen, den Aufbau Ihrer web-Anwendung zu verweisen?

    EDIT: __AssemblyInfo__.ini Datei in oben genannten Ordner geben Sie den Pfad, von dem Albums.dll war kopiert.

    • Keine Warnung beim kompilieren. Ich habe zwei Projekte, die root-app-Projekt und die subapp-Projekt. Subapp Referenz-root-app-Projekt.
    • Ich dachte über Albums.dll – wie ist das verwiesen wird in beiden Projekten? Ist das dein Projekt?
    • Ja, beide sind meine Projekte. Ich Verweis Albums.dll (das ist die Ausgabe des root-Projekt) in dem sub-Projekt über Projekt verweisen. Ist es das, was Sie wissen wollten ? (Kein C/P in der sub-app-Projekt bin)
    • OK, haben Sie ausgegraben vielleicht, wenn dies geschieht? Sie sagte nach dem Zufallsprinzip, aber könnte es sein, dass dies nur geschieht, nachdem IIS neu gestartet, oder die Anwendung nicht verwendet wird, für einige Zeit, oder nach dem pool-recycling -, Umbau-Anwendung … ? Sie könnten auch versuchen, das verschieben von Alben.LocalizationConfigurationHandler in ein separates Projekt und verweisen Sie von beiden root-und sub-sub-Projekt.
    • Ein Punkt wundert mich, diese beiden Dateien (Album.dll) sind in magickecb sub-app, so dass Sie sein müssen immer es irgendwie doppelt – Referenz + andere Weise – immer noch versuchen zu denken, wie dies passieren konnte. Ist der Aufruf: return (LocalizationConfiguration)ConfigurationManager.GetSection(„Lokalisation/Lokalisierung“); root app oder sub-app?
    • Wir konnten nicht lokalisieren, wenn das problem Auftritt. Wir gehen wie folgt vor : stop-website, kopieren, dll -, Neustart-website. Dann, kommt es von 10 Minuten bis zu x Stunden.. die website hat wenig traffic (nur von devs). Bezüglich der Doppel-Referenz, wie ich die genannten in der post ist, vermute ich, eine erste Referenz von /bin auto-load-und eine zweite in GetSection, die möglicherweise intern führen Sie ein LoadFrom. Das Geheimnis ist, dass wir nie benutzt haben, dieses problem vor…
    • Versuchen Sie, eine andere Sache, sollte es die Datei: __ AssemblyInfo __.ini außer diese 2 Album.dlls – ich denke, das ist der Pfad, von dem dieser Schatten Kopie gemacht wurde. Gehen Sie in beide Ordner (Temporäre…ASP.NET Dateien\magickecb\4414db97\126f5aaf\assembly\dl3\ cf281292\4a6ecec8_8a7bcb01 und 017fab88\a91238d1_7977cb01 ) und sehen, ob Sie kopiert wurden, von dem gleichen Ort
    • Durch bevor, ich sollte etwas präziser werden : wir verwendet, um zu öffnen, die von der root-app, die einen iframe auch der Kontext der zweiten app, um zu starten unsere flex-app. Nun, wir können die Last, die flex-app aus dem inneren der Wurzel flex-app. Die verschwommene Sache ist, dass wir nicht sicher über die timeline (die wir auch integriert auf TFS vor kurzem).. also wir sind wirklich ahnungslos auf den Ursprung des Fehlers
    • Haben Sie sich __ AssemblyInfo __.ini-Dateien, wie ich vorgeschlagen, in einem früheren Kommentar? Überprüfen Sie auch in Ihrem sub-app .csproj-Datei, wenn Sie finden kann Album.dll vorkommen, sollten Sie nur einen Verweis auf Album.csproj (oder was auch immer Ihre Stamm-Projekt die Projekt-Datei-name)
    • Ich denke, du hast Recht…. Ich habe nach der dll im Temporären Internet-Dateien und öffnete Ihre relative AssemblyInfo.ini… haben Wir 2 verschiedene dll von zwei verschiedenen Pfad. Wie ? ein temp gesichert hatte einige dlls (einschließlich Albums.dll) und legen Sie Sie in /bin/backup…. Wie konnte ich das übersehen :(…. Tests werden gemacht, aber ich denke, es ist OK jetzt
    • Bestätigt !.. Vielen Dank an Euch ! 🙂

  2. 0

    Zimmerreserviereung, ohne das Sie eine Erklärung für dein Problem würde ich vorschlagen, registrieren Sie die assembly in den GAC und verwenden Sie es von dort.

Kostenlose Online-Tests