[C#] Lokalisierung von Anwendungen - Satellite Assembly

LutzBerillio

Grünschnabel
Servus Leute,

ich komme schon wieder mit Fragen zu Satellite Assemblies.
Ich habe eine Lib geschrieben die mir aus einem externen System Sprachdaten zieht und diese Daten dann in verschiedene Formate zur Weiterverarbeitung umwandelt. Eines dieser Weiterverarbeitungsformate ist für .NET Programme die Satellite Assembly.

Hierzu erstelle ich programmatisch mit dem ResXResourceWriter die .resx Dateien. Diese schicke ich dann über ResGen um die .resources Dateien zu erhalten und schließlich über al.exe um die Satellite Assembly zu erzeugen.

Soweit, sogut...

Nun würde ich gerne eine Anwendung basteln, die mir eine Überprüfung der Assemblies ermöglicht. Ich wollte gerne hierzu über einen File-Chooser eine Assembly auswählen lassen und dann "einfach" alle Key-Value-Pairs in einem Data-Grid-View ausgeben lassen.

Nun dachte ich das wäre nicht soooo dramatisch in der Umsetzung, aber wurde eines Besseren belehrt. Ich kriege einfach die Assemblies nicht geladen, jedenfalls nicht so, dass ich über den ResourceManager einen String abrufen könnte.

Dazu zu sagen ist noch folgendes:
In meinen Satellite Assemblies sind mehrere .resources-Dateien inkludiert. (SatelliteAssemblyChecker.Text.Sprachdaten1.de.resources, SatelliteAssemblyChecker.Text.Sprachdaten2.de.resources).
Und die .resources-Dateien enthalten NUR strings, also keine anderen Resourcen!

Hier noch ein wenig Code von mir, mit dem ich versuche zu testen:
Code:
var dir = Directory.GetCurrentDirectory() + "\\" + Thread.CurrentThread.CurrentUICulture.ToString() + "\\";
Assembly asm = Assembly.LoadFrom(dir + "SatelliteAssemblyChecker.resources.dll");
this._rm = new ResourceManager("SatelliteAssemblyChecker.Text.Sprachdaten1.de", asm);
...
this._rm.GetString("AdresseDefText");

Irgendwas scheint mit den Namespaces nicht zu passen. Er motzt beim Zugriff auf den String:
Für die angegebene Kultur oder die neutrale Kultur konnten keine Ressourcen gefunden werden. Stellen Sie sicher, dass SatelliteAssemblyChecker.Text.Sprachdaten1.de.resources beim Kompilieren richtig in die Assembly SatelliteAssemblyChecker.resources eingebettet wurde, oder dass die erforderlichen Satellitenassemblys geladen werden können und vollständig signiert sind.

Richtig platziert habe ich die Assemblies eigentlich auch:
  • SatelliteAssemblyChecker.exe/de-DE/SatelliteAssemblyChecker.resources.dll
  • SatelliteAssemblyChecker.exe/en-US/SatelliteAssemblyChecker.resources.dll
...

Ich hoffe mir kann hier jemand weiterhelfen mit dem Laden und dem Zugriff auf die Sprachdaten. Im Netz bin ich schon seit Tagen am suchen, aber find irgendwie nix, was mir weiter hilft...
Irgendwie ist Lokalisierung für mich nen sehr frustrierendes Thema bei .NET ...

Danke euch allen schonmal für's Lesen
 
Habe das Problem gefunden... Nachdem ich mit "Red Gate's .NET Reflector" mir die DLL mal angeschaut habe, ist mir aufgefallen, dass die .resx-Dateien in die Satellite Assembly eincompiliert waren, anstatt der .resources-Dateien.

War also ein Fehler in meinem DLL-erzeugenden Programm. Habe den Fehler da nun ausgebessert und siehe da: DIE VARIANTE VON OBEN FUNKTIONIERT NUN!! :D

Was sich mir jetzt allerdings als schwierig darstellt:
Wenn ich nun ja verschiedene DLLs auswählen lassen will, kann ich ja den BaseName für den ResourceManager nicht mehr hardcodieren, sondern muss den irgendwie aus der geladenen DLL auslesen können.

Hat da jemand eine Idee wie ich das machen könnte?

Gruß
Chris
 
Und auch dieses Problem hat sich nun verflüchtigt!

Vielleicht hilft's ja irgendwem mal weiter:

Code:
// Load the choosen assembly and get the embedded resource names
this._assembly = Assembly.LoadFrom(AssemblyTextBox.Text);
foreach (string resourceName in this._assembly.GetManifestResourceNames())
{
	BaseNameComboBox.Items.Add(resourceName);
	this.SetDebugMessage("Loading base name: {0}", resourceName);
}

Alle Probleme hiermit nun gelöst.

Gruß
Chris
 
Zurück