C# - kann Nicht immer ein string von der ResourceManager - (von Sat-Montage)
Entwickle ich eine lokalisierbare Anwendung. In meinem "lokalen" Ressourcen-Datei, ich habe die Sprache standardmäßig verwendet wird (Englisch) und, wenn möglich, lade ich die Benutzereinstellungen und Kultur und laden von Zeichenfolgen übersetzt, ist die Sprache.
Also, was ich getan habe :
private static CultureInfo _culture = CultureInfo.CurrentUICulture;
private static ResourceManager _manager;
private static void ToNeutralCulture()
{
while (!_culture.IsNeutralCulture)
{
_culture = _culture.Parent;
}
}
private static void LoadCulture()
{
ResourceManager manager = Properties.Resources.ResourceManager;
try
{
ToNeutralCulture();
string assembly = Assembly.GetCallingAssembly().GetName().CodeBase;
string assemblyDir = Path.GetDirectoryName(assembly);
string assemblyName = Path.GetFileNameWithoutExtension(assembly);
string resourceFileName = string.Format(CultureInfo.InvariantCulture,
@"{0}\{1}_{2}.dll",
assemblyDir,
assemblyName,
_culture.Name.ToUpper());
FileInfo resourceFile = new FileInfo(resourceFileName);
if (resourceFile.Exists)
{
Assembly resourceAssembly = Assembly.LoadFrom(resourceFile.FullName);
string[] manifests = resourceAssembly.GetManifestResourceNames();
if (manifests.Length == 1)
{
manager = new ResourceManager(manifests[0], resourceAssembly);
}
using (ResourceReader reader = new ResourceReader(resourceAssembly.GetManifestResourceStream(manifests[0])))
{
IDictionaryEnumerator dict = reader.GetEnumerator();
while (dict.MoveNext())
{
string key = dict.Key as string;
object val = dict.Value;
//string mVal = manager.GetString(key);
}
}
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
Trace.WriteLine(string.Format(CultureInfo.InvariantCulture,
"Fail to loading culture {0}",
(_culture == null) ? "--" : _culture.EnglishName));
}
_manager = manager;
}
Versammlung ordnungsgemäß geladen und den Zähler zeigt mir alle Ressourcen in die Ressource-Datei, gut, funktioniert gut, außer :
string mVal = manager.GetString(key);
Wenn ich diese Zeile auskommentiert, ich habe eine System.Resources.MissingManifestResourceException
, kann mir jemand sagen warum?
Dank !
[BEARBEITEN]
Projekt "MyApp"
namespace MyApp
{
Assembly resourceAssembly = Assembly.LoadFrom(resourceFileName);
string[] manifests = resourceAssembly.GetManifestResourceNames();
if (manifests.Length == 1)
{
manager = new ResourceManager(manifests[0], resourceAssembly);
}
//Throws the exception
manager.GetString("PleaseCallIT", null);
//Works
using (ResourceReader reader = new ResourceReader(resourceAssembly.GetManifestResourceStream(manifests[0])))
{
IDictionaryEnumerator dict = reader.GetEnumerator();
while (dict.MoveNext())
{
string key = dict.key as string; //PleaseCallIT
object val = dict.value; //Please call IT.
}
}
}
Projekt "MyApp_FR" (Ressourcen.Designer.cs automatisch generierte Datei)
namespace MyApp.Properties {
//...
internal static string PleaseCallIT {
get {
return ResourceManager.GetString("PleaseCallIT", resourceCulture);
}
}
}
Verstehe ich nicht...
Was ist die Fehlermeldung in Verbindung mit der Ausnahme? Die folgenden Fragen und Antworten können Ihnen helfen, aus: stackoverflow.com/questions/1327692/...
Ja, ich bin sicher, wenn ich die Schleife mit den Enumerator, habe ich alle strings, die ich in meinem Sat-Ressource-Datei.
Enttäuschung" : Schon geschaut, funktioniert nicht.
Dang, wie etwa diese (bei denen es letztlich darauf an, einen namespace Problem, ich sammle): jameswho.blogspot.com/2004/06/...
InformationsquelleAutor Arnaud F. | 2011-03-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich, warum, hoffe, das wird helfen, jemand, der in den gleichen Fall.
So, ich sah in MyApp_FR.dll den generierten code zu verwenden der Ressourcendatei ist es :
aber beim abrufen der manifest-Datei die Namen, die ich bekam :
Scheint zu sein, dass es einen
.resource
zu viel in diesem Raum... Indem Sie es, ich kann mit meinem ResourceManager normalerweise alles Prima funktioniert...Endgültige code :
.resources
vor der Verladung. Auch Sat-Baugruppen generiert aus VS scheitern. Also ich denke, es gibt Raum für Verbesserung, wie .NETTO-Griffe Sat-Baugruppen. Vielen Dank für Ihre detektivische Arbeit.InformationsquelleAutor Arnaud F.
Von Microsoft-Support:
Dieses problem tritt auf, wenn Sie eine lokalisierte Ressource, die es in einer satellite-assembly, die Sie erstellt, mit ein .Ressourcen-Datei, die auf einer ungeeigneten Dateinamen. Dieses problem tritt normalerweise auf, wenn Sie manuell erstellen Sie eine Satelliten-assembly:
Versuchen, diese KB:
http://support.microsoft.com/kb/839861
InformationsquelleAutor ukhardy
Einen alternativen Ansatz, setzen Sie die folgenden test-code:
Debuggen, prüfen Sie den Inhalt von Ressourcen zu sehen, ob es dem entspricht, was man beim laden mit ResourceManager.
Besonders beachten, wenn man so etwas wie " MyAssembly..Ressourcen.Ressourcen", dann müssen Sie explizit hinzufügen "Ressourcen", um die ResourceManager-Konstruktors:
InformationsquelleAutor Jahmic