tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
14
ZUGRIFFE
1015
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Macan Macan ist offline Mitglied Bronze
    Registriert seit
    Nov 2006
    Ort
    München
    Beiträge
    41
    So - ich mal wieder :/

    Die Resourcen lassen mich einfach nicht los.
    Folgendes habe ich gemacht:
    Code :
    1
    2
    
    Locale.resx
    Locale.de.resx
    sind erstellt und werden auch eingebunden.

    Code :
    1
    2
    
        Thread::CurrentThread->CurrentCulture = gcnew CultureInfo(Name);
        ResMan = gcnew ResourceManager("Client.Locale", Assembly::GetExecutingAssembly());
    Obiges ist auch 1:1 aus einem MSDN Beispiel übernommen.

    Code :
    1
    
    MessageBox::Show(LocalManager::ResMan->GetString("TestString"));

    Der Spass ist, ich bekomme gleich bei Programmstart eine System.IO.FileLoadException (erste Chance). Die wird natürlich schon von der Runtime abgefangen und somit falle ich eben immer auf die eingebettete (englische) Sprachresource zurück. Die Exception kommt bei jedem Durchlauf des obigen Codes.

    Die Namen der Dateien sind wohl richtig, denn FxCop zeigt, dass alles richtig eingebunden wurde. Strong Names sind auch in Ordnung und richtig signiert.
    Sicherheitshalber habe ich es schon komplett ohne Keys versucht, aber auch das macht keinen Unterschied.

    Was übersehe ich da? Weiss das vielleicht jemand?

    P.S.: Interessant ist zumindest folgendes: Vorher habe ich ja keine .resx Dateien verwendet und meine .txt Dateien mittels resgen in .resources überführt. Dort gab es zumindest einen Namensunterschied: "Client.Locale" war dann einfach nur "Locale". Aber das dürfte wohl nichts mit dem Fehler zu tun haben (vor allem bekäme ich, würden die Namen nun falsch sein, eine MissingManifest...Exception).
     
    Einen schönen Tag noch,
    Macan

  2. #2
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Hi Markus!

    Versuch das ganze mal so:
    Code cpp:
    1
    
    gcnew ResourceManager( __typeof(Locale)->FullName, __typeof(Locale)->Assembly );
    Wenn es nun klappt, hast einen Fehler in dem "Client.Locale" String drinne. Oder es war nicht die richtige Assembly.
    Btw. wenn Du Application.Run in einem try-catch-Block ausführst, bekommst auch die Zeile
    und kannst evtl auch noch eine InnerException auslesen....
    Geändert von Christian Kusmanow (23.11.06 um 09:18 Uhr)
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  3. #3
    Macan Macan ist offline Mitglied Bronze
    Registriert seit
    Nov 2006
    Ort
    München
    Beiträge
    41
    Hallo Christian

    Versuch das ganze mal so:
    Gut - mach ich sofort.

    Btw. wenn Du Application.Run in einem try-catch-Block ausführst, bekommst auch die Zeile
    und kannst evtl auch noch eine InnerException auslesen....
    Das hat witzigerweise nicht funktioniert - bin überfragt, warum. Vielleicht, weil ich kein Form, sondern einen ApplicationContext starte.
     
    Einen schönen Tag noch,
    Macan

  4. #4
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Zitat Zitat von Macan Beitrag anzeigen
    Das hat witzigerweise nicht funktioniert - bin überfragt, warum. Vielleicht, weil ich kein Form, sondern einen ApplicationContext starte.
    Warum ein ApplicationContext? Hast Du vor das Form deiner Anwendung auszutauschen?
    Ansonsten würd ich für das eigentliche Programm noch eine Klasse definieren.
    Wenn Du schon innerhalb der MainMethode oder in der Klasse die die MainMethode enhält,
    auf Namespaces deiner Anwendung zugreifst, bekommst immer einen Laufzeitfehler.
    Geändert von Christian Kusmanow (21.11.06 um 15:20 Uhr)
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  5. #5
    Macan Macan ist offline Mitglied Bronze
    Registriert seit
    Nov 2006
    Ort
    München
    Beiträge
    41
    Warum ein ApplicationContext? Hast Du vor das Form deiner Anwendung auszutauschen?
    Ansonsten würd ich für das eigentliche Programm noch eine Klasse definieren.
    Genau. Ich habe da mehrere Forms und will nicht immer alles mit Update() aktualisieren lassen. Die Klasse habe ich auch geschrieben und von ApplicationContext abgeleitet. Funktioniert alles und nur in dieser Klasse arbeite ich eigentlich wirklich (mit namespaces).

    Mit diesem typeof (in C++ ist das wohl typeid oder einfach GetType()) kann ich nicht wirklich etwas anfangen. Sprich, ich kann das nicht in C++ übersetzen (finde da FullName, etc. einfach nicht).

    Und... nur mal zur Sicherheit:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
        Context^ App = gcnew Context;
        try {
            Application::Run(App);}
        catch (System::Exception^ e)
            {
            MessageBox::Show(e->InnerException->Message);
            }
    So sieht mein catch aus. Aber vielleicht bin ich da auf dem falschen Dampfer damit.
     
    Einen schönen Tag noch,
    Macan

  6. #6
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Zitat Zitat von Macan Beitrag anzeigen
    Mit diesem typeof (in C++ ist das wohl typeid oder einfach GetType()) kann ich nicht wirklich etwas anfangen. Sprich, ich kann das nicht in C++ übersetzen (finde da FullName, etc. einfach nicht).
    Ja, hast recht. Hab mal auf der MSDN nachgeschaut. __typeof währe dazu sicher das Equivalent dazu in c++.
    GetType() macht aber das gleiche...

    Zitat Zitat von Macan Beitrag anzeigen
    Und... nur mal zur Sicherheit:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
        Context^ App = gcnew Context;
        try {
            Application::Run(App);}
        catch (System::Exception^ e)
            {
            MessageBox::Show(e->InnerException->Message);
            }
    So sieht mein catch aus. Aber vielleicht bin ich da auf dem falschen Dampfer damit.
    Nein, bist nicht. Aber Du gibst die Exception ansich gar ned aus.
    Eine InnerException ist auch nicht immer verfügbar. D. h. dass es einen zu einer NullReferenceException kommen kann,
    wenn Du versuchst auf die InnerException->Message zuzugreifen.
    Prüfe daher ob die InnerException nicht null ist und gib sie dann erst mit aus.
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  7. #7
    Macan Macan ist offline Mitglied Bronze
    Registriert seit
    Nov 2006
    Ort
    München
    Beiträge
    41
    Das habe ich nur schnell noch einmal reingetippt. Das Problem ist, dass die MessageBox sich nicht zeigt. Genauso läuft es auch, wenn ich die Zuweisung des ResourceManagers und die GetString() Methode catche - alle Fehler werden wohl schon intern abgefangen und erreichen mich überhaupt nicht:
    Eine Ausnahme (erste Chance) des Typs "System.IO.FileLoadException" ist in mscorlib.dll aufgetreten.
    ist alles, was ich zu sehen bekomme (im Ausgabefenster).
    Würde ich nun ein Namensproblem haben, dann kommt sofort ein Ausnahmefenster.

    EDIT: Aber es ist gut zu wissen, immer erst die Existenz der InnerException zu prüfen
    Noch einmal EDIT: Ich weiss einfach nicht, wie ich den Type von "Locale" bekomme, denn das ist ja keine Klasse, Typ, etc. Oder sehe ich das falsch? (Ist ja nur ein String, der übergeben wird).
    Jetzt aber - letzter EDIT: __typeof ist die alte Notation. typeid müsste es dann sein. Aber weder mit GetType, noch mit typeid bekomme ich solch ein Konstrukt hin (mit Fullname, etc.).
    Geändert von Macan (21.11.06 um 16:16 Uhr)
     
    Einen schönen Tag noch,
    Macan

  8. #8
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Wann und wo wird der ResourceManager instanziert?
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  9. #9
    Macan Macan ist offline Mitglied Bronze
    Registriert seit
    Nov 2006
    Ort
    München
    Beiträge
    41
    Hmmm, das könnte vielleicht das Problem sein. Der ResourceManager wird in einer Init-Methode, die gleich am Anfang im Konstruktor der LocaleResourcen-Klasse aufgerufen wird, instantiiert (also mehr oder weniger, denn... static ResMan).
    Dann wird diese Init-Methode bei Sprachwechsel wieder aufgerufen (und auch dann kommt immer die FileLoadException).
    Ich habe ResMan auch schon nonstatic versucht - macht keinen Unterschied (aber vielleicht hatte ich da auch noch andere Fehler dabei).
    Du wirst mir jetzt sicher gleich sagen, dass static das Problem ist, weil dadurch das Object nicht neu instantiiert werden kann? *g*

    EDIT: Noch etwas witziges: Wenn ich etwas in den .resx Dateien verändere, dann kommt beim nächsten Start z.B. nur die deutsche Resource... dann beim nächsten Start wieder nur die englische...
     
    Einen schönen Tag noch,
    Macan

  10. #10
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    __typeof muss aber laut der MSDN existieren.
    http://msdn.microsoft.com/library/de...mxkeywords.asp

    Mach einen trockenen Test diesbezüglich. Du weisst das ich habe keine großartige Ahnung von c++ habe.
    Teste den Kram plain nur so kommst dem Fehler selber auf die Spur.
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  11. #11
    Macan Macan ist offline Mitglied Bronze
    Registriert seit
    Nov 2006
    Ort
    München
    Beiträge
    41
    __typeof muss aber laut der MSDN existieren.
    Das ja, nur muss ich da noch etwas beachten, wenn ich die alte Notation verwenden will. Wie gesagt, Reflection ist noch ein Buch mit sieben Siegeln für mich
    Frei nach Deiner Signatur:
    Ich weiss noch nicht einmal, dass ich ein Problem mit irgend etwas habe

    Teste den Kram plain nur so kommst dem Fehler selber auf die Spur.
    Gut - das mache ich. Trockenschwimmen quasi

    Danke für Deine Geduld
     
    Einen schönen Tag noch,
    Macan

  12. #12
    Macan Macan ist offline Mitglied Bronze
    Registriert seit
    Nov 2006
    Ort
    München
    Beiträge
    41
    Tatsache
    Leeres Projekt und es funktioniert genau so.

    Ich danke Dir
     
    Einen schönen Tag noch,
    Macan

  13. #13
    Macan Macan ist offline Mitglied Bronze
    Registriert seit
    Nov 2006
    Ort
    München
    Beiträge
    41
    Noch ein letztes Wort dazu. Nachdem ich mir sicher sein konnte, dass alles richtig ist (gut, den ResourceManager muss man nur einmal instantiieren), habe ich ein neues Projekt erstellt, alle .h und .cpp Dateien wieder eingegliedert... und nun funktioniert es.

    Scheint wohl ein internes Problem gewesen zu sein.
     
    Einen schönen Tag noch,
    Macan

  14. #14
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Schätze mal es lag an den Projekteinstellungen.
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  15. #15
    Macan Macan ist offline Mitglied Bronze
    Registriert seit
    Nov 2006
    Ort
    München
    Beiträge
    41
    Entweder das (wobei ich, meines Wissens nach, nichts umgestellt hatte). Zumindest lag in meinem Projekt noch ein zusätzlicher Ordner (Filter mit Namen "zusätzliche Dateien" oder so ähnlich). Dieser Filter war ausgegraut, also nicht zugänglich. Ich denke mal, dass sich dieser und weitere Probleme bei einem Neustart (VS meldete einen Fehler und startete sich neu) ergeben haben.

    Also als Tipp an alle - wenn etwas funktionieren sollte, sich jedoch partout weigert - Projekt säubern (hat bei mir jedoch nicht geholfen) oder eben gleich ein neues Projekt erstellen und alle Dateien wieder eingliedern.

    Interessant ist eines noch:
    Wenn ich mein Projekt neu compiliere, dann kommt immer mal wieder besagte FileLoadException (auch, wenn ich die Projektmappe neu erstelle). Zweimal neu erstellen - und der Fehler ist immer weg.
     
    Einen schönen Tag noch,
    Macan

Ähnliche Themen

  1. Werte in .resx Dateien als Variablen behandeln
    Von Macan im Forum .NET Café
    Antworten: 0
    Letzter Beitrag: 15.04.07, 21:14
  2. Lokalisierung .resx oder .resources - Komplexe Grundsatzfrage zur Lokalisierung
    Von Macan im Forum .NET Application und Service Design
    Antworten: 13
    Letzter Beitrag: 08.11.06, 14:14
  3. Wie kann man resx-Datei in ASP.NET lesen?
    Von Yujun im Forum .NET Archiv
    Antworten: 0
    Letzter Beitrag: 15.06.05, 16:08