Frage

Mein Code:

System.Resources.ResourceManager resourceManager = GetResourceManager();
string str = resourceManager.GetString("delete", new CultureInfo(1033));

Im aktuellen Projekt kompiliert unter .NET 2.0 alles funktioniert wie vorbehalten. Variable str enthält Ressourcen-String für LCID 1033 -. Löschen , das ist ok

Wir sind jetzt ein Upgrade auf .NET 4.0, neu kompiliert Projekt unter Zielframework .NET 4.0. Nun kompiliert als .NET 4.0 Baugruppen, es wirft Ausnahme System.ArgumentNullException mit der Meldung Der Wert darf nicht null sein .STACK Spur:.

   at System.Threading.Monitor.Enter(Object obj)
   at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark)
   at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
   at System.Resources.ResourceManager.GetString(String name, CultureInfo culture)

hier interessant ist stacktrace, wo es verweist auf interne Rahmenverfahren in ResourceManager.InternalGetResourceSet , die auf Anruf verursacht Monitor.Enter mit Null-Objekt. Aber ich rufe Methode GetString mit nicht null Parameter GetString ( "delete", neue Culture (1033)) .

Dieser Fehler scheint System.ArgumentNullException in System.Threading ähnlich. Monitor.Enter . Vielleicht sonst einige Fehler in Monitor.Enter, oder was?

Update: Wenn ich Objekt resourceManager.ResourceSets.Items[2].Value.Table["delete"] aussehen in Debugger dann enthält es String-Wert „Delete“. Eigenschaft Items [2] hier zeigt auf LCID 1033. Dies bedeutet, dass Ressourcen-Manager bereits lokalisierte Zeichenfolge enthält für Ressourcenschlüssel Löschen in Sprache 1033 . Hat jemand weiß, wo Fehler sein kann?

War es hilfreich?

Lösung

Ich denke auch, dass Sie erklären und Ihr eigenes Wörterbuch für die Lagerung verwenden sollten, da ResourceSets als obsolet unter .NET 4.0 markiert

Andere Tipps

fand ich mich beantworten. Hier sind Details: Wir haben benutzerdefinierte Implementierung von Resourcemanager wie folgt:

public class DatabaseResourceManager : System.Resources.ResourceManager 
{
  public DatabaseResourceManager(int applicationID, string bundle) 
  {
    foreach (int languageID in ResourceProvider.Provider.GetLanguages(applicationID))
    {
      DatabaseResourceReader r = new DatabaseResourceReader(applicationID, bundle, languageID);
      ResourceSets.Add(new CultureInfo(languageID), new ResourceSet(r));
    }
}

In .NET 2.0 es funktioniert gut, aber in .NET 4.0 etwas hat bei der Umsetzung von ResourceManager.I geändert denkt, dass Problem ist in parameterlosen Konstruktor, die in .NET 2.0 instantiate privaten Bereich this._resourceSets (die später verwendet in InternalGetResourceSet für Monitor.Enter). Aber in .NET 4.0 parameterlosen Konstruktor nicht instantiate privaten Bereich this._resourceSets und somit versagt es später (wie abobe).

Ich muß meine benutzerdefinierten Ressource-Manager neu zu schreiben, da dies zur Arbeit:

public class DatabaseResourceManager : System.Resources.ResourceManager 
{
  public DatabaseResourceManager(int applicationID, string bundle) 
  {
    ResourceSets = new Hashtable();
    this.applicationID = applicationID;
    this.bundle = bundle;
  }

  protected override ResourceSet InternalGetResourceSet(CultureInfo culture, bool createIfNotExists, bool tryParents)
  {
    if (this.ResourceSets.Contains(culture.Name))
        return this.ResourceSets[culture.Name] as ResourceSet;

    lock (syncLock)
    {
        if (this.ResourceSets.Contains(culture.Name))
            return this.ResourceSets[culture.Name] as ResourceSet;

        DatabaseResourceReader r = new DatabaseResourceReader(applicationID, bundle, culture.LCID);
        ResourceSet rs = new ResourceSet(r);

        this.ResourceSets.Add(culture.Name, rs);

        return rs;
    }
  }
}

„Magic“ hier ist, dass ich Methode überschreiben muss InternalGetResourceSet meine Ressourcen von benutzerdefinierten Speicher (db) und zurück „ResourceSet“ für bestimmte Kultur zu laden. Jetzt funktioniert es wie ein Charme.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top