Laden...

[gelöst] Problem mit CurrentUICulture nach Umstellung von XP (32 bit) auf Win7 (64 bit)

Erstellt von MichaHah vor 9 Jahren Letzter Beitrag vor 9 Jahren 4.436 Views
M
MichaHah Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren
[gelöst] Problem mit CurrentUICulture nach Umstellung von XP (32 bit) auf Win7 (64 bit)

Hallo zusammen,

Ich habe unter XP (32 bit) mit MS Visual Studio Express 2010 ein Programm erstellt. Unter anderem habe ich eine Sprachumstellung über die CurrentUICulture und entsprechende Resource Dateien integriert. Lief auch alles super. Letzte Woche wurde aber mein Rechner auf Win 7 (64 bit) umgestellt. Wegen div. Fehlermeldungen und Bugs in Visual Studio Express 2010 habe ich auf Visual Studio Express 2012 umgestellt.

Leider funktioniert jetzt aber die Sprachumstellung nicht mehr!

Kann mir jemand helfen? Ist das ein bekanntes Problem? Bitte beachten: Mit XP (32bit) und VS Express 2010 hatte es funktioniert...

Codeauszug:

iniEinstellungen = new INIDatei(".\\einstellungen.ini");

//Sprache lesen und einstellen
this.sprache = Convert.ToInt32(iniEinstellungen.getValue("einstellungen", "sprache"));

switch (sprache)
{
case 0: //englisch
 Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
 break;
case 1:  //deutsch
 Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");
 break;
case 2:  //russisch
 Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru");
 break;
default: //default -> englisch
 Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
 break;

Danach erst kommt "InitializeComponent();", was den Form erstellt.

Freue mich auch eure Antworten 😃
MfG
MichaHah

MfG
MichaHah

4.221 Beiträge seit 2005
vor 9 Jahren

Na dann debug mal... und schau ob Dein Code angesprungen wird... und ob er in den richtigen Case reingeht ...

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

M
MichaHah Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

Habe ich bereits. Code wird ausgeführt. Danach steht in der CurrentUICulture auch die richtige Info. Die richtige Sprache wird aber trotzdem nicht übernommen.

MfG
MichaHah

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo MichaHah,

sind vielleicht die Build-Einstellungen durcheinander gekommen? Sind die Ressourcen vorhanden und werden sie beim Build tatsächlich eingebunden? Für weitere mögliche Ursachen siehe [FAQ] Programm läuft in anderer Umgebung nicht (richtig).

Geht es, wenn du ein minimales Beispiel erstellst? Siehe [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden.

herbivore

M
MichaHah Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

In einem Miniprojekt sind die Spracheinstellungen übernommen worden, wobei ich mich an diese Anleitung gehalten habe: Walkthrough: Localizing Windows Forms

Wenn ich die Sprache in meinem Hauptprojekt umschalte (Eigenschaften -> Language), werden mir die Sprachen richtig angezeigt.
Mit "Projektmappe neu erstellen" werden die Resources auch neu erstellt.
Führe ich dann das Programm aus (egal ob debuggen oder starten der erstellten Datei), wird die Sprache nicht korrekt dargestellt.

MfG
MichaHah

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo MichaHah,

dann hast du doch jetzt die Voraussetzungen, um mit [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden den Fehler einzugrenzen.

herbivore

M
MichaHah Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

Nach der Methode versuche ich bereits den Fehler zu finden. Bisher ohne Erfolg...

Erstellt wurde das Programm mit Visual Studio Express 2008, weiterentwickelt mit VSE 2010. Nun arbeit, wie erwähnt, mit VSE 2012. Kann es sein, das von 2008 noch irgendeine Altlast drinne steckt? Kennt sich jemand so detailliert damit aus?

Update:
Beim Debuggen ist mir aufgefallen, wenn ich kurz nach der Anweisung:

resources.ApplyResources(this.menuSprache, "menuSprache");

das Debuggen beende wird in der Ausgabe folgendes angezeigt:
Einzelschritt: Nichtbenutzercode "System.ComponentModel.ComponentResourceManager.ApplyResources" wird übersprungen.

Wie kann das sein? Welche Gründe gibt es, das der Code übersprungen wird?

MfG
MichaHah

M
MichaHah Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

Noch eine andere Idee:
Gibt es eine Möglichkeit, nach der _InitializeComponent() _die Übersetzungen manuell zuzuweisen?

InitializeComponent();
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr");
resources.ApplyResources(this.groupDistAnglDisconnection, "groupDistAnglDisconnection");

Oben genannter Code gibt zwar keine Fehlermeldung, funktionieren tut er aber auch nicht...

MfG
MichaHah

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo MichaHah,

InitializeComponent ist aus Sicht des Compilers eine Methode wie jede andere auch. Natürlich kannst du auch nach dem Aufruf von InitializeComponent noch Code ausführen. Und das sollte prinzipiell auch klappen.

Nur ist das hier eben ein klassischer Fall von: tut es aus irgendeinem Grund nicht. Es hilft alles nichts; den Grund musst du finden. Und in dem Links steht beschrieben, wie es geht. Das mag bei einem großen Projekt aufwändig sein, aber da musst du eben durch. Am Ende ist es schneller, als alles rumstochern.

herbivore

M
MichaHah Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

Mir ist noch folgende Kuriosität aufgefallen:

Das Programm ist für .NET 2.0 entwickelt.
Seit der Umstellung sind die Verweise für

  • System.Core
  • System.Data.DataSetExtensions
  • System.Xml.Linq
    defekt.

Ich habe ein neues Projekt angelegt (VSE legt automatisch .NET 4.5 als Zielframewok vor -> erster Fehler?!), Sprachumschaltung eingebaut und das funktioniert. Stelle ich den Zielframework auf 2.0 funktioniert es nicht.
Kurioserweise hat in meinem Hauptprogramm die Sprachumstellung unter 2.0 einmal funktioniert...

Wenn ich den Framework auf 4.0 hochstelle kriege ich die Fehlermeldung "Mixed mode assembly is build against version 'v1.1.4322' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information"

Wie kann ich also die Sprachumstellung in 2.0 nutzen?

MfG
MichaHah

5.658 Beiträge seit 2006
vor 9 Jahren

Hi MichaHah,

so wie es klingt, hast du als einem Programm, das für den Framework 2 kompiliert ist, eine DLL referenziert, die für den Framework 4 kompiliert ist.

Christian

Weeks of programming can save you hours of planning

M
MichaHah Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

Hallo Christian,

wie bekomme ich denn die heraus für welchen Framework eine Resource-Datei kompiliert ist? Ich war davon ausgegangen, dass das Zielframework in den Projekteigenschaften für das ganze Projekt gilt.
Es geht ja nicht um eine externe Quelle, sondern um eine, die Visual Studio selber einbindet...

Gruß MichaHah

MfG
MichaHah

M
MichaHah Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

Habe das Problem gefunden (denke ich). Laut den Links s.u. gibt es die Funktion ApplyResources() zwar schon recht lange. Wenn man aber .NET 2.0 auf einem Win 7-Rechner nutzt klappt es nicht, weil diese Plattform einfach nicht mehr unterstützt wird...

Der unter XP kompilierte Code funktioniert allerdings auf einem Win 7 Rechner!!!

ComponentResourceManager.ApplyResources-Methode (Object, String) (.NET 4)


ComponentResourceManager.ApplyResources-Methode (Object, String) (.NET 2)

Werde wohl auf 4.0 umstellen müssen, was andere Fehlermeldungen hervorruft... (melde mich ggf. wieder)

MfG
MichaHah

4.939 Beiträge seit 2008
vor 9 Jahren

Hallo,

doch, alle .NET 2.0 Methoden werden noch unter Windows 7 unterstützt. (Die Dokumentation zu .NET 2.0 ist jedoch schon so alt, daß Windows Vista, 7 und 8 nicht erwähnt werden!)

Und bzgl. der Fehlermeldung beim Umstellen auf .NET 4 siehe Running .NET 2 Runtime applications under the .NET 4 Runtime.

Es muß irgendeinen anderen Grund geben...

5.658 Beiträge seit 2006
vor 9 Jahren

Hi MichaHah,

ich kann dein Problem noch nicht ganz nachvollziehen. Die Version einer referenzierten DLL kannst du dir im Project Explorer anzeigen lassen (Properties -> Runtime Version). Für nicht-referenzierte DLLs geht das z.B. mit ildasm.exe oder dem Reflector. Aber das findet man auch sehr schnell mit Google heraus. Auf .NET 4 umzustellen, ist wahrscheinlich gar nicht notwendig.

Christian

Weeks of programming can save you hours of planning

M
MichaHah Themenstarter:in
9 Beiträge seit 2014
vor 9 Jahren

Habe jetzt:

  • "AnyCPU" auf "X86" umgestellt
  • defekte *.dll-Verweise gelöscht
  • app.Config ergänzt um:
	<startup useLegacyV2RuntimeActivationPolicy="true">
	  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
	</startup>
	<runtime>
	  <NetFx40_LegacySecurityPolicy enabled="true"/>
	</runtime>

Jetzt funktioniert es 😃
Vielen Dank für eure Mithilfe!

MfG
MichaHah