Verpacken und Bereitstellen von Ressourcen in .NET-AppsPackaging and Deploying Resources in .NET Apps

Anwendungen sind davon abhängig, dass der .NET Framework-Ressourcen-Manager, der von der Klasse ResourceManager dargestellt wird, lokalisierte Ressourcen abruft.Applications rely on the .NET Framework Resource Manager, represented by the ResourceManager class, to retrieve localized resources. Der Ressourcen-Manager geht davon aus, dass ein Speichenarchitektur-Modell (Hub-and-Spoke) verwendet wird, um Ressourcen zu verpacken und bereitzustellen.The Resource Manager assumes that a hub and spoke model is used to package and deploy resources. Der Hub ist die Hauptassembly, die den nicht lokalisierbaren, ausführbaren Code und die Ressourcen für eine einzelne Kultur enthält, die als neutrale oder Standardkultur bezeichnet wird.The hub is the main assembly that contains the nonlocalizable executable code and the resources for a single culture, called the neutral or default culture. Die Standardkultur ist die Ausweichkultur der Anwendung. Dabei handelt es sich um die Kultur, deren Ressourcen verwendet werden, wenn keine lokalisierten Ressourcen gefunden werden können.The default culture is the fallback culture for the application; it is the culture whose resources are used if localized resources cannot be found. Jede Speiche ist mit einer Satellitenassembly verbunden, die die Ressourcen für eine einzelne Kultur aber keinen Code enthält.Each spoke connects to a satellite assembly that contains the resources for a single culture, but does not contain any code.

Dieses Modell hat mehrere Vorzüge:There are several advantages to this model:

  • Sie können Ressourcen für neue Kulturen inkrementell hinzufügen, nachdem Sie eine Anwendung bereitgestellt haben.You can incrementally add resources for new cultures after you have deployed an application. Da die aufeinanderfolgende Entwicklung von kulturspezifischen Ressourcen viel Zeit in Anspruch nehmen kann, können Sie so zunächst Ihre Hauptanwendung veröffentlichen und kulturspezifische Ressourcen zu einem späteren Zeitpunkt nachreichen.Because subsequent development of culture-specific resources can require a significant amount of time, this allows you to release your main application first, and deliver culture-specific resources at a later date.
  • Sie können die Satellitenassembly einer Anwendung aktualisieren oder ändern, ohne die Anwendung erneut kompilieren zu müssen.You can update and change an application's satellite assemblies without recompiling the application.
  • Eine Anwendung muss nur die Satellitenassemblys laden, die die für eine bestimmte Kultur benötigten Ressourcen enthalten.An application needs to load only those satellite assemblies that contain the resources needed for a particular culture. Dadurch kann die Auslastung von Systemressourcen deutlich verringert werden.This can significantly reduce the use of system resources.

Dennoch hat dieses Modell auch Nachteile:However, there are also disadvantages to this model:

  • Sie müssen mehrere Ressourcensätze gleichzeitig verwalten.You must manage multiple sets of resources.
  • Der anfängliche Kostenaufwand für das Testen einer Anwendung steigt, da Sie mehrere Konfigurationen überprüfen müssen.The initial cost of testing an application increases, because you must test several configurations. Beachten Sie, dass es auf lange Sicht einfacher und kostengünstiger wird, eine Kernanwendung mit mehreren Satelliten zu testen, als mehrere internationale Versionen gleichzeitig zu testen und zu verwalten.Note that in the long term it will be easier and less expensive to test one core application with several satellites, than to test and maintain several parallel international versions.

Benennungs Konventionen für RessourcenResource naming conventions

Wenn Sie die Ressourcen Ihrer Anwendung verpacken, müssen Sie diese gemäß den Namenskonventionen für Ressourcen benennen, die von der Common Language Runtime (CLR) erwartet werden.When you package your application's resources, you must name them using the resource naming conventions that the common language runtime expects. Die Runtime identifiziert eine Ressource anhand deren Kulturnamen.The runtime identifies a resource by its culture name. Jede Kultur erhält einen eindeutigen Namen, für gewöhnlich eine Kombination aus zwei Kleinbuchstaben, die für eine Kultur und die damit verbundene Sprache steht, und, falls erforderlich, zwei Großbuchstaben, die für eine Subkultur und das damit verbundene Land bzw. die Region stehen.Each culture is given a unique name, which is usually a combination of a two-letter, lowercase culture name associated with a language and, if required, a two-letter, uppercase subculture name associated with a country or region. Der Name der Subkultur steht hinter dem Namen der Kultur, getrennt durch einen Bindestrich (-).The subculture name follows the culture name, separated by a dash (-). Dies kann z.B. ja-JP für das in Japan gesprochene Japanisch sein, en-US für das amerikanische Englisch, de-DE für das in Deutschland gesprochene Deutsch oder de-AT für Österreichisch.Examples include ja-JP for Japanese as spoken in Japan, en-US for English as spoken in the United States, de-DE for German as spoken in Germany, or de-AT for German as spoken in Austria. Siehe die Spalte Sprach-Tag in der Liste der von Windows unterstützten Sprach- und Regionsnamen.See the Language tag column in the list of language/region names supported by Windows. Kulturnamen befolgen den von BCP 47 definierten Standard.Culture names follow the standard defined by BCP 47.

Hinweis

Es gibt einige Ausnahmen für die Kultur Namen mit zwei Buchstaben, z. b. zh-Hans für Chinesisch (vereinfacht).There are some exceptions for the two-letter culture names, such as zh-Hans for Chinese (Simplified).

Hinweis

Informationen zum Erstellen von Ressourcendateien finden Sie unter Erstellen von Ressourcendateien und Erstellen von Satellitenassemblys.For information about creating resource files, see Creating Resource Files and Creating Satellite Assemblies.

Der Ressourcenfallback-ProzessThe Resource Fallback Process

Das Speichenarchitektur-Modell (Hub-and-Spoke) zum Verpacken und Bereitstellen von Ressourcen setzt einen Fallbackprozess ein, um die passenden Ressourcen zu finden.The hub and spoke model for packaging and deploying resources uses a fallback process to locate appropriate resources. Wenn eine Anwendung eine lokalisierte Ressource anfordert, die nicht verfügbar ist, durchsucht die CLR die Hierarchie von Kulturen nach einer passenden Ausweichressource, die am ehesten der Anfrage der Anwendung des Benutzers entspricht, und löst eine Ausnahme nur dann aus, wenn es keine andere Möglichkeit gibt.If an application requests a localized resource that is unavailable, the common language runtime searches the hierarchy of cultures for an appropriate fallback resource that most closely matches the user's application's request, and throws an exception only as a last resort. Wenn eine passende Ressource auf einer der Ebenen der Hierarchie gefunden wird, verwendet die Runtime diese.At each level of the hierarchy, if an appropriate resource is found, the runtime uses it. Wenn keine Ressource gefunden wird, wird die Suche auf der nächsten Ebene fortgesetzt.If the resource is not found, the search continues at the next level.

Um die Suchleistung zu verbessern, wenden Sie das Attribut NeutralResourcesLanguageAttribute auf Ihre Hauptassembly an, und übergeben Sie diesem den Namen der neutralen Sprache, die mit Ihrer Hauptassembly funktioniert.To improve lookup performance, apply the NeutralResourcesLanguageAttribute attribute to your main assembly, and pass it the name of the neutral language that will work with your main assembly.

.NET Framework-Ressourcenfallback-Prozess.NET Framework resource fallback process

Der .NET Framework-Ressourcenfallbackprozess besteht aus folgenden Schritten:The .NET Framework resource fallback process involves the following steps:

Tipp

Möglicherweise können Sie auch den Fallbackprozess von Ressourcen und den Suchprozess der Runtime nach Ressourcenassemblys mit dem Konfigurationselement <relativeBindForResources> verbessern.You may be able to use the <relativeBindForResources> configuration element to optimize the resource fallback process and the process by which the runtime probes for resource assemblies. Weitere Informationen finden Sie im Abschnitt Verbessern des Ressourcenfallbackprozesses.For more information, see the Optimizing the Resource Fallback Process section.

  1. Zunächst prüft die Runtime den globalen Assemblycache auf eine Assembly, die der angeforderten Kultur für Ihre Anwendung entspricht.The runtime first checks the global assembly cache for an assembly that matches the requested culture for your application.

    Der globale Assemblycache kann Ressourcenassemblys speichern, die in vielen Anwendungen eingesetzt werden.The global assembly cache can store resource assemblies that are shared by many applications. So müssen Sie keine bestimmten Ressourcensätze in die Verzeichnisstruktur von jeder Anwendung, die sie erstellen, einbeziehen.This frees you from having to include specific sets of resources in the directory structure of every application you create. Wenn die Runtime einen Verweis auf die Assembly findet, durchsucht sie die Assembly nach der angeforderten Ressource.If the runtime finds a reference to the assembly, it searches the assembly for the requested resource. Wenn sie den Eintrag in der Assembly findet, verwendet sie die angeforderte Ressource.If it finds the entry in the assembly, it uses the requested resource. Wenn sie den Eintrag nicht findet, fährt sie mit der Suche fort.If it doesn't find the entry, it continues the search.

  2. Als Nächstes prüft die Runtime das Verzeichnis der aktuell ausgeführten Assembly auf ein Unterverzeichnis, das der angeforderten Kultur entspricht.The runtime next checks the directory of the currently executing assembly for a subdirectory that matches the requested culture. Wenn sie das Unterverzeichnis findet, durchsucht sie es nach einer gültigen Satellitenassembly für die angeforderte Kultur.If it finds the subdirectory, it searches that subdirectory for a valid satellite assembly for the requested culture. Dann durchsucht die Runtime die Satellitenassembly nach der angeforderten Ressource.The runtime then searches the satellite assembly for the requested resource. Wenn sie die Ressource in der Assembly findet, verwendet sie diese.If it finds the resource in the assembly, it uses it. Wenn sie die Ressource nicht findet, fährt sie mit der Suche fort.If it doesn't find the resource, it continues the search.

  3. Anschließend fragt die Runtime den Windows Installer ab, um zu bestimmten, ob die Satellitenassembly bei Bedarf installiert werden soll.The runtime next queries the Windows Installer to determine whether the satellite assembly is to be installed on demand. Wenn dies der Fall ist, kümmert sie sich um die Installation, lädt die Assembly und durchsucht diese nach der angeforderten Ressource.If so, it handles the installation, loads the assembly, and searches it or the requested resource. Wenn sie die Ressource in der Assembly findet, verwendet sie diese.If it finds the resource in the assembly, it uses it. Wenn sie die Ressource nicht findet, fährt sie mit der Suche fort.If it doesn't find the resource, it continues the search.

  4. Die Runtime löst das Ereignis AppDomain.AssemblyResolve aus, um anzugeben, dass die Satellitenassembly nicht gefunden werden kann.The runtime raises the AppDomain.AssemblyResolve event to indicate that it is unable to find the satellite assembly. Wenn Sie das Ereignis behandeln möchten, kann Ihr Ereignishandler einen Verweis auf die Satellitenassembly zurückgeben, deren Ressourcen bei der Suche verwendet werden.If you choose to handle the event, your event handler can return a reference to the satellite assembly whose resources will be used for the lookup. Andernfalls gibt der Ereignishandler null zurück und die Suche wird fortgesetzt.Otherwise, the event handler returns null and the search continues.

  5. Als Nächstes durchsucht die Runtime erneut den globalen Assemblycache, aber dieses Mal sucht sie nach der übergeordneten Assembly der angeforderten Kultur.The runtime next searches the global assembly cache again, this time for the parent assembly of the requested culture. Wenn die übergeordnete Assembly im globalen Assemblycache vorhanden ist, durchsucht die Runtime die Assembly nach der angeforderten Ressource.If the parent assembly exists in the global assembly cache, the runtime searches the assembly for the requested resource.

    Die übergeordnete Kultur ist als zulässige Fallbackkultur definiert.The parent culture is defined as the appropriate fallback culture. Übergeordnete Elemente könne als Fallback genutzt werden, da da Bereitstellen einer Ressource dem Auslösen einer Ausnahme vorzuziehen ist.Consider parents as fallback candidates, because providing any resource is preferable to throwing an exception. Durch diesen Prozess könne Sie auch Ressourcen wiederverwenden.This process also allows you to reuse resources. Sie sollten auf der Ebene des übergeordneten Elements nur dann eine bestimmte Ressource verwenden, wenn die untergeordnete Kultur die angeforderte Ressource nicht lokalisieren muss.You should include a particular resource at the parent level only if the child culture doesn't need to localize the requested resource. Wenn Sie z.B. eine Satellitenassembly für en (neutrales Englisch), en-GB (britisches Englisch) und en-US (amerikanisches Englisch) bereitstellen, enthält der en-Satellit das gemeinsame Vokabular, und die Satelliten für en-GB und en-US enthalten nur Überschreibungen für Begriffe, die sich in den beiden Kulturen unterscheiden.For example, if you supply satellite assemblies for en (neutral English), en-GB (English as spoken in the United Kingdom), and en-US (English as spoken in the United States), the en satellite would contain the common terminology, and the en-GB and en-US satellites could provide overrides for only those terms that differ.

  6. Als Nächstes prüft die Runtime das Verzeichnis der aktuell ausgeführten Assembly auf übergeordnete Verzeichnisse.The runtime next checks the directory of the currently executing assembly to see if it contains a parent directory. Wenn ein übergeordnetes Verzeichnis vorhanden ist, durchsucht die Runtime das Verzeichnis nach einer gültigen Satellitenassembly für die übergeordnete Kultur.If a parent directory exists, the runtime searches the directory for a valid satellite assembly for the parent culture. Wenn sie die Assembly findet, durchsucht die Runtime die Assembly nach der angeforderten Ressource.If it finds the assembly, the runtime searches the assembly for the requested resource. Wenn sie die Ressource findet, verwendet sie diese.If it finds the resource, it uses it. Wenn sie die Ressource nicht findet, fährt sie mit der Suche fort.If it doesn't find the resource, it continues the search.

  7. Anschließend fragt die Runtime den Windows Installer ab, um zu bestimmten, ob die übergeordnete Satellitenassembly bei Bedarf installiert werden soll.The runtime next queries the Windows Installer to determine whether the parent satellite assembly is to be installed on demand. Wenn dies der Fall ist, kümmert sie sich um die Installation, lädt die Assembly und durchsucht diese nach der angeforderten Ressource.If so, it handles the installation, loads the assembly, and searches it or the requested resource. Wenn sie die Ressource in der Assembly findet, verwendet sie diese.If it finds the resource in the assembly, it uses it. Wenn sie die Ressource nicht findet, fährt sie mit der Suche fort.If it doesn't find the resource, it continues the search.

  8. Die Runtime löst das Ereignis AppDomain.AssemblyResolve aus, um anzugeben, dass die entsprechende Fallbackressource nicht gefunden werden kann.The runtime raises the AppDomain.AssemblyResolve event to indicate that it is unable to find an appropriate fallback resource. Wenn Sie das Ereignis behandeln möchten, kann Ihr Ereignishandler einen Verweis auf die Satellitenassembly zurückgeben, deren Ressourcen bei der Suche verwendet werden.If you choose to handle the event, your event handler can return a reference to the satellite assembly whose resources will be used for the lookup. Andernfalls gibt der Ereignishandler null zurück und die Suche wird fortgesetzt.Otherwise, the event handler returns null and the search continues.

  9. Als Nächstes durchsucht die Runtime die übergeordnete Assembly genauso wie in den drei vorherigen Schritten auf vielen möglichen Ebenen.The runtime next searches parent assemblies, as in the previous three steps, through many potential levels. Jede Kultur hat nur ein übergeordnetes Element, das durch die CultureInfo.Parent-Eigenschaft definiert wird. Ein übergeordnetes Element kann jedoch wieder sein eigenes übergeordnetes Element haben.Each culture has only one parent, which is defined by the CultureInfo.Parent property, but a parent might have its own parent. Die Suche nach übergeordneten Kulturen ist beendet, wenn die Parent-Eigenschaft einer Kultur CultureInfo.InvariantCulture zurückgibt. Beim Ressourcenfallback wird die invariante Kultur nicht als übergeordnete Kultur oder als Kultur angesehen, die Ressourcen haben kann.The search for parent cultures stops when a culture's Parent property returns CultureInfo.InvariantCulture; for resource fallback, the invariant culture is not considered a parent culture or a culture that can have resources.

  10. Wenn die ursprünglich angegebene Kultur und alle übergeordneten Elemente durchsucht wurden, und die Ressource immer noch nicht gefunden werden kann, wir die Ressource für die Standardkultur (Fallback) verwendet.If the culture that was originally specified and all parents have been searched and the resource is still not found, the resource for the default (fallback) culture is used. Für gewöhnlich werden die Ressourcen der Standardkultur in die Hauptassembly der Anwendung integriert.Typically, the resources for the default culture are included in the main application assembly. Sie könne aber einen Wert von Satellite für die Location-Eigenschaft des NeutralResourcesLanguageAttribute-Attributs angeben, um festzulegen, dass der endgültige Fallbackort für Ressourcen eine Satellitenassembly ist und nicht die Hauptassembly.However, you can specify a value of Satellite for the Location property of the NeutralResourcesLanguageAttribute attribute to indicate that the ultimate fallback location for resources is a satellite assembly, rather than the main assembly.

    Hinweis

    Die Standardressource ist die einzige Ressource, die mit der Hauptassembly kompiliert werden kann.The default resource is the only resource that can be compiled with the main assembly. Wenn Sie nicht mit dem NeutralResourcesLanguageAttribute-Attribut eine Satellitenassembly angegeben haben, ist sie der endgültige Fallback (letztes übergeordnetes Element).Unless you specify a satellite assembly by using the NeutralResourcesLanguageAttribute attribute, it is the ultimate fallback (final parent). Deshalb wird empfohlen, dass Sie immer ein Standardset an Ressourcen in Ihre Hauptassembly integrieren.Therefore, we recommend that you always include a default set of resources in your main assembly. So werden Ausnahmen verhindert.This helps prevent exceptions from being thrown. Durch das Integrieren einer Standardressourcendatei stellen Sie einen Fallback für alle Ressourcen zur Verfügung und stellen sicher, dass immer mindestens eine Ressource für den Benutzer verfügbar ist, auch wenn diese nicht kulturspezifisch ist.By including a default resource, file you provide a fallback for all resources and ensure that at least one resource is always present for the user, even if it is not culturally specific.

  11. Wenn die Runtime keine Ressource für eine Standard(fallback)kultur findet, wird die Ausnahme MissingManifestResourceException oder MissingSatelliteAssemblyException ausgelöst, um anzugeben, dass die Ressource nicht gefunden werden konnte.Finally, if the runtime doesn't find a resource for a default (fallback) culture, a MissingManifestResourceException or MissingSatelliteAssemblyException exception is thrown to indicate that the resource could not be found.

Nehmen Sie z.B. an, dass die Anwendung eine lokalisierte Ressource für Spanisch (Mexiko) anfordert (die Kultur es-MX).For example, suppose the application requests a resource localized for Spanish (Mexico) (the es-MX culture). Zunächst durchsucht die Runtime den globalen Assemblycache nach der Assembly, die es-MX entspricht. Diese kann jedoch nicht gefunden werden.The runtime first searches the global assembly cache for the assembly that matches es-MX, but doesn't find it. Dann durchsucht die Runtime das Verzeichnis der aktuell ausgeführten Assembly nach dem Verzeichnis es-MX.The runtime then searches the directory of the currently executing assembly for an es-MX directory. Da auch dies zu keinem Ergebnis führt, durchsucht die Runtime erneut den globalen Assemblycache nach einer übergeordneten Kultur, die der entsprechenden Fallbackkultur entspricht – in diesem Fall es (Spanisch).Failing that, the runtime searches the global assembly cache again for a parent assembly that reflects the appropriate fallback culture — in this case, es (Spanish). Wenn die übergeordnete Assembly nicht gefunden werden kann, durchsucht die Runtime alle potenziellen Ebenen von übergeordneten Assemblys nach der Kultur es-MX, bis sie eine passende Ressource findet.If the parent assembly is not found, the runtime searches all potential levels of parent assemblies for the es-MX culture until it finds a corresponding resource. Wenn keine Ressource gefunden werden kann, verwendet die Runtime die Ressource der Standardkultur.If a resource isn't found, the runtime uses the resource for the default culture.

Optimieren des .NET Framework-Ressourcenfallback-ProzessesOptimizing the .NET Framework Resource Fallback Process

Unter folgenden Bedingungen können Sie den Prozess optimieren, mit dem die Runtime nach Ressourcen in den Satellitenassemblys suchtUnder the following conditions, you can optimize the process by which the runtime searches for resources in satellite assemblies

  • Satellitenassemblys werden am gleichen Ort wie die Codeassembly bereitgestellt.Satellite assemblies are deployed in the same location as the code assembly. Wenn die Codeassembly im globalen Assemblycache installiert wird, werden gleichzeitig Satellitenassemblys im globalen Assemblycache installiert.If the code assembly is installed in the Global Assembly Cache, satellite assemblies are also installed in the global assembly cache. Wenn die Codeassembly in einem Verzeichnis installiert wird, werden Satellitenassemblys in kulturspezifischen Ordnern in diesem Verzeichnisses installiert.If the code assembly is installed in a directory, satellite assemblies are installed in culture-specific folders of that directory.

  • Satellitenassemblys werden nicht bei Bedarf installiert.Satellite assemblies are not installed on demand.

  • Der Anwendungscode behandelt nicht das Ereignis AppDomain.AssemblyResolve.Application code does not handle the AppDomain.AssemblyResolve event.

Sie können die Überprüfung auf Satellitenassemblys durch das Integrieren des Elements <relativeBindForResources> optimieren, und indem Sie dessen enabled-Attribut in der Anwendungskonfigurationsdatei auf true festlegen, wie in folgendem Beispiel veranschaulicht.You optimize the probe for satellite assemblies by including the <relativeBindForResources> element and setting its enabled attribute to true in the application configuration file, as shown in the following example.

<configuration>
   <runtime>
      <relativeBindForResources enabled="true" />
   </runtime>
</configuration>

Die optimierte Überprüfung auf Satellitenassemblys ist ein Opt-In-Feature.The optimized probe for satellite assemblies is an opt-in feature. Das heißt, dass die Runtime die Schritte aus Der Ressourcenfallback-Prozess durchführt, es sei denn, das Element <relativeBindForResources> befindet sich in der Anwendungskonfigurationsdatei, während dessen enabled-Attribut auf true festgelegt ist.That is, the runtime follows the steps documented in The Resource Fallback Process unless the <relativeBindForResources> element is present in the application's configuration file and its enabled attribute is set to true. Wenn dies der Fall ist, wird der Suchprozess nach einer Satellitenassembly wie folgt angepasst:If this is the case, the process of probing for a satellite assembly is modified as follows:

  • Die Runtime verwendet den Speicherort der übergeordneten Codeassembly, um nach der Satellitenassembly zu suchen.The runtime uses the location of the parent code assembly to probe for the satellite assembly. Wenn die übergeordnete Assembly im globalen Assemblycache installiert ist, durchsucht die Runtime den Cache, aber nicht das Anwendungsverzeichnis.If the parent assembly is installed in the global assembly cache, the runtime probes in the cache but not in the application's directory. Wenn die übergeordnete Assembly im Anwendungsverzeichnis installiert ist, durchsucht die Runtime das Anwendungsverzeichnis, aber nicht den globalen Assemblycache.If the parent assembly is installed in an application directory, the runtime probes in the application directory but not in the global assembly cache.

  • Die Runtime fragt den Windows Installer nicht nach der On-Demand-Installation von Satellitenassemblys.The runtime doesn't query the Windows Installer for on-demand installation of satellite assemblies.

  • Wenn die Suche nach einer bestimmten Ressourcenassembly fehlschlägt, löst die Runtime nicht das Ereignis AppDomain.AssemblyResolve aus.If the probe for a particular resource assembly fails, the runtime does not raise the AppDomain.AssemblyResolve event.

.NET Core-Ressourcenfallback-Prozess.NET Core resource fallback process

Der .NET Core-Ressourcenfallbackprozess besteht aus folgenden Schritten:The .NET Core resource fallback process involves the following steps:

  1. Die Runtime versucht, eine Satellitenassembly für die angeforderte Kultur zu laden.The runtime attempts to load a satellite assembly for the requested culture.

    • Die Runtime prüft das Verzeichnis der aktuell ausgeführten Assembly auf ein Unterverzeichnis, das der angeforderten Kultur entspricht.Checks the directory of the currently executing assembly for a subdirectory that matches the requested culture. Wenn sie das Unterverzeichnis findet, durchsucht sie es nach einer gültigen Satellitenassembly für die angeforderte Kultur und lädt sie.If it finds the subdirectory, it searches that subdirectory for a valid satellite assembly for the requested culture and loads it.

      Hinweis

      Bei Betriebssystemen mit Groß-/Kleinschreibung berücksichtigenden Dateisystemen (d.h. Linux und macOS) wird bei der Suche nach dem Kulturnamen-Unterverzeichnis die Groß-/Kleinschreibung beachtet.On operating systems with case-sensitive file systems (that is, Linux and macOS), the culture name subdirectory search is case-sensitive. Der Name des Unterverzeichnisses muss der Groß-/Kleinschreibung von CultureInfo.Name genau entsprechen (z. B. es oder es-MX).The subdirectory name must exactly match the case of the CultureInfo.Name (for example, es or es-MX).

      Hinweis

      Wenn der Programmierer einen benutzerdefinierten Assemblyladekontext aus AssemblyLoadContext abgeleitet hat, ist die Situation kompliziert.If the programmer has derived a custom assembly load context from AssemblyLoadContext, the situation is complicated. Wenn die ausführende Assembly in den benutzerdefinierten Kontext geladen wurde, lädt die Runtime die Satellitenassembly in den benutzerdefinierten Kontext.If the executing assembly was loaded into the custom context, the runtime loads the satellite assembly into the custom context. Die Details sind nicht Gegenstand dieses Dokuments.The details are out of scope for this document. Siehe AssemblyLoadContext.See AssemblyLoadContext.

    • Wenn keine Satellitenassembly gefunden wurde, löst AssemblyLoadContext das Ereignis AssemblyLoadContext.Resolving aus, um anzugeben, dass die Satellitenassembly nicht gefunden werden kann.If a satellite assemble has not been found, the AssemblyLoadContext raises the AssemblyLoadContext.Resolving event to indicate that it is unable to find the satellite assembly. Wenn Sie das Ereignis behandeln möchten, kann Ihr Ereignishandler einen Verweis auf die Satellitenassembly laden und zurückgeben.If you choose to handle the event, your event handler can load and return a reference to the satellite assembly.

    • Wenn immer noch keine Satellitenassembly gefunden wurde, bewirkt AssemblyLoadContext, dass die AppDomain ein AppDomain.AssemblyResolve-Ereignis auslöst, um anzugeben, dass die Satellitenassembly nicht gefunden werden kann.If a satellite assembly still has not been found, the AssemblyLoadContext causes the AppDomain to trigger an AppDomain.AssemblyResolve event to indicate that it is unable to find the satellite assembly. Wenn Sie das Ereignis behandeln möchten, kann Ihr Ereignishandler einen Verweis auf die Satellitenassembly laden und zurückgeben.If you choose to handle the event, your event handler can load and return a reference to the satellite assembly.

  2. Wenn eine Satellitenassembly gefunden wurde, durchsucht die Runtime die Satellitenassembly nach der angeforderten Ressource.If a satellite assembly is found, the runtime searches it for the requested resource. Wenn sie die Ressource in der Assembly findet, verwendet sie diese.If it finds the resource in the assembly, it uses it. Wenn sie die Ressource nicht findet, fährt sie mit der Suche fort.If it doesn't find the resource, it continues the search.

    Hinweis

    Um eine Ressource in der Satellitenassembly zu finden, sucht die Runtime nach der Ressourcendatei, die vom ResourceManager für den aktuellen CultureInfo.Name angefordert wird.To find a resource within the satellite assembly, the runtime searches for the resource file requested by the ResourceManager for the current CultureInfo.Name. In der Ressourcendatei sucht sie nach dem angeforderten Ressourcennamen.Within the resource file it searches for the requested resource name. Wenn keins von beiden gefunden wird, wird die Ressource als nicht gefunden behandelt.If either is not found, the resource is treated as not found.

  3. Als Nächstes sucht die Runtime die Assemblys der übergeordneten Kultur über viele mögliche Ebenen hinweg, wobei jedes Mal die Schritte 1 und 2 wiederholt werden.The runtime next searches the parent culture assemblies through many potential levels, each time repeating steps 1 & 2.

    Die übergeordnete Kultur ist als zulässige Fallbackkultur definiert.The parent culture is defined as an appropriate fallback culture. Übergeordnete Elemente könne als Fallback genutzt werden, da da Bereitstellen einer Ressource dem Auslösen einer Ausnahme vorzuziehen ist.Consider parents as fallback candidates, because providing any resource is preferable to throwing an exception. Durch diesen Prozess könne Sie auch Ressourcen wiederverwenden.This process also allows you to reuse resources. Sie sollten auf der Ebene des übergeordneten Elements nur dann eine bestimmte Ressource verwenden, wenn die untergeordnete Kultur die angeforderte Ressource nicht lokalisieren muss.You should include a particular resource at the parent level only if the child culture doesn't need to localize the requested resource. Wenn Sie z.B. eine Satellitenassembly für en (neutrales Englisch), en-GB (britisches Englisch) und en-US (amerikanisches Englisch) bereitstellen, enthält der en-Satellit das gemeinsame Vokabular, und die Satelliten für en-GB und en-US enthalten nur Überschreibungen für Begriffe, die sich in den beiden Kulturen unterscheiden.For example, if you supply satellite assemblies for en (neutral English), en-GB (English as spoken in the United Kingdom), and en-US (English as spoken in the United States), the en satellite contains the common terminology, and the en-GB and en-US satellites provides overrides for only those terms that differ.

    Jede Kultur hat nur ein übergeordnetes Element, das durch die CultureInfo.Parent-Eigenschaft definiert wird. Ein übergeordnetes Element kann jedoch wieder sein eigenes übergeordnetes Element haben.Each culture has only one parent, which is defined by the CultureInfo.Parent property, but a parent might have its own parent. Die Suche nach übergeordneten Kulturen ist beendet, wenn die Parent-Eigenschaft einer Kultur CultureInfo.InvariantCulture zurückgibt.The search for parent cultures stops when a culture's Parent property returns CultureInfo.InvariantCulture. Beim Ressourcenfallback wird die invariante Kultur nicht als übergeordnete Kultur oder als Kultur angesehen, die Ressourcen haben kann.For resource fallback, the invariant culture is not considered a parent culture or a culture that can have resources.

  4. Wenn die ursprünglich angegebene Kultur und alle übergeordneten Elemente durchsucht wurden, und die Ressource immer noch nicht gefunden werden kann, wir die Ressource für die Standardkultur (Fallback) verwendet.If the culture that was originally specified and all parents have been searched and the resource is still not found, the resource for the default (fallback) culture is used. Für gewöhnlich werden die Ressourcen der Standardkultur in die Hauptassembly der Anwendung integriert.Typically, the resources for the default culture are included in the main application assembly. Sie könne aber einen Wert von Satellite für die Location-Eigenschaft angeben, um festzulegen, dass der endgültige Fallbackort für Ressourcen eine Satellitenassembly ist und nicht die Hauptassembly.However, you can specify a value of Satellite for the Location property to indicate that the ultimate fallback location for resources is a satellite assembly rather than the main assembly.

    Hinweis

    Die Standardressource ist die einzige Ressource, die mit der Hauptassembly kompiliert werden kann.The default resource is the only resource that can be compiled with the main assembly. Wenn Sie nicht mit dem NeutralResourcesLanguageAttribute-Attribut eine Satellitenassembly angegeben haben, ist sie der endgültige Fallback (letztes übergeordnetes Element).Unless you specify a satellite assembly by using the NeutralResourcesLanguageAttribute attribute, it is the ultimate fallback (final parent). Deshalb wird empfohlen, dass Sie immer ein Standardset an Ressourcen in Ihre Hauptassembly integrieren.Therefore, we recommend that you always include a default set of resources in your main assembly. So werden Ausnahmen verhindert.This helps prevent exceptions from being thrown. Durch das Integrieren einer Standardressourcendatei stellen Sie einen Fallback für alle Ressourcen zur Verfügung und stellen sicher, dass immer mindestens eine Ressource für den Benutzer verfügbar ist, auch wenn diese nicht kulturspezifisch ist.By including a default resource file, you provide a fallback for all resources and ensure that at least one resource is always present for the user, even if it is not culturally specific.

  5. Wenn die Runtime keine Ressourcendatei für eine Standardkultur (Fallback) findet, wird die Ausnahme MissingManifestResourceException oder MissingSatelliteAssemblyException ausgelöst, um anzugeben, dass die Ressource nicht gefunden werden konnte.Finally, if the runtime doesn't find a resource file for a default (fallback) culture, a MissingManifestResourceException or MissingSatelliteAssemblyException exception is thrown to indicate that the resource could not be found. Wenn die Ressourcendatei gefunden wird, aber die angeforderte Ressource nicht vorhanden ist, gibt die Anforderung null zurück.If the resource file is found but the requested resource is not present the request returns null.

Endgültiger Fallback der SatellitenassemblyUltimate Fallback to Satellite Assembly

Sie können optional Ressourcen aus der Hauptassembly entfernen und angeben, dass die Runtime die endgültige Fallbackressource aus einer Satellitenassembly für eine bestimmte Kultur laden soll.You can optionally remove resources from the main assembly and specify that the runtime should load the ultimate fallback resources from a satellite assembly that corresponds to a specific culture. Um den Fallbackprozess zu steuern, können Sie den NeutralResourcesLanguageAttribute.NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation)-Konstruktor verwenden und einen Wert für den Parameter UltimateResourceFallbackLocation angeben, der bestimmt, ob der Ressourcen-Manager die Fallbackressource aus der Hauptassembly oder aus einer Satellitenassembly extrahieren soll.To control the fallback process, you use the NeutralResourcesLanguageAttribute.NeutralResourcesLanguageAttribute(String, UltimateResourceFallbackLocation) constructor and supply a value for the UltimateResourceFallbackLocation parameter that specifies whether Resource Manager should extract the fallback resources from the main assembly or from a satellite assembly.

Im folgenden .NET Framework-Beispiel wird das Attribut NeutralResourcesLanguageAttribute dazu verwendet, die Fallbackressource einer Anwendung in einer Satellitenassembly für Französisch (fr) zu speichern.The following .NET Framework example uses the NeutralResourcesLanguageAttribute attribute to store an application's fallback resources in a satellite assembly for the French (fr) language. Im Beispiel werden zwei textbasierte Ressourcendateien verwendet, die eine einzelne Zeichenfolgenressource mit dem Namen Greeting definieren.The example has two text-based resource files that define a single string resource named Greeting. Die erste Datei, „resources.fr.txt“, enthält eine französische Sprachressource.The first, resources.fr.txt, contains a French language resource.

Greeting=Bon jour!

Die zweite Datei, „resources.ru.txt“, enthält eine russische Sprachressource.The second, resources,ru.txt, contains a Russian language resource.

Greeting=Добрый день

Diese beiden Dateien werden zu RESOURCES-Datei kompiliert, indem Sie das Resource File Generator-Tool („resgen.exe“) in der Befehlszeile ausführen.These two files are compiled to .resources files by running the resource file generator (Resgen.exe) from the command line. Der Befehl für die französische Sprachressource lautet:For the French language resource, the command is:

resgen.exe resources.fr.txtresgen.exe resources.fr.txt

Der Befehl für die russische Sprachressource lautet:For the Russian language resource, the command is:

resgen.exe resources.ru.txtresgen.exe resources.ru.txt

Die RESOURCES-Dateien werden in DLLs (Dynamic Link Libraries) eingebettet, indem Sie den Assemblylinker („al.exe“) in der Befehlszeile für die französische Sprachressource wie folgt ausführen:The .resources files are embedded into dynamic link libraries by running assembly linker (Al.exe) from the command line for the French language resource as follows:

al /t:lib /embed:resources.fr.resources /culture:fr /out:fr\Example1.resources.dllal /t:lib /embed:resources.fr.resources /culture:fr /out:fr\Example1.resources.dll

und für die russische Sprachressource:and for the Russian language resource as follows:

al /t:lib /embed:resources.ru.resources /culture:ru /out:ru\Example1.resources.dllal /t:lib /embed:resources.ru.resources /culture:ru /out:ru\Example1.resources.dll

Der Quellcode der Anwendung befindet sich in einer Datei mit dem Namen „example1.cs“ oder „example1.vb“.The application source code resides in a file named Example1.cs or Example1.vb. Er beinhaltet das Attribut NeutralResourcesLanguageAttribute, um anzugeben, dass sich die Standardanwendungsressource im Unterverzeichnis „fr“ befindet.It includes the NeutralResourcesLanguageAttribute attribute to indicate that the default application resource is in the fr subdirectory. Er instantiiert den Ressourcen-Manager, ruft den Wert der Greeting-Ressource ab und zeigt ihn in der Konsole an.It instantiates the Resource Manager, retrieves the value of the Greeting resource, and displays it to the console.

using System;
using System.Reflection;
using System.Resources;

[assembly:NeutralResourcesLanguage("fr", UltimateResourceFallbackLocation.Satellite)]

public class Example
{
   public static void Main()
   {
      ResourceManager rm = new ResourceManager("resources", 
                                               typeof(Example).Assembly);
      string greeting = rm.GetString("Greeting");
      Console.WriteLine(greeting); 
   }
}
Imports System.Reflection
Imports System.Resources

<Assembly:NeutralResourcesLanguage("fr", UltimateResourceFallbackLocation.Satellite)>
Module Example
   Public Sub Main()
      Dim rm As New ResourceManager("resources", GetType(Example).Assembly)
      Dim greeting As String = rm.GetString("Greeting")
      Console.WriteLine(greeting) 
   End Sub
End Module

Dann können Sie den C#-Quellcode aus der Befehlszeile wie folgt kompilieren:You can then compile C# source code from the command line as follows:

csc Example1.cs

Der Befehl für den Visual Basic-Compiler ist sehr ähnlich:The command for the Visual Basic compiler is very similar:

vbc Example1.vb

Da keine Ressourcen in der Hauptassembly eingebettet sind, müssen Sie nicht mit dem /resource-Switch kompilieren.Because there are no resources embedded in the main assembly, you do not have to compile by using the /resource switch.

Wenn Sie das Beispiel in einem System durchführen, dessen Sprachen nicht Russisch ist, wird die folgende Ausgabe angezeigt:When you run the example from a system whose language is anything other than Russian, it displays the following output:

Bon jour!

Empfohlene VerpackalternativeSuggested Packaging Alternative

Möglicherweise können Sie aus Zeit- oder Kostengründen keinen Satz an Ressourcen für jede Subkultur erstellen, die von Ihrer Anwendung unterstützt wird.Time or budget constraints might prevent you from creating a set of resources for every subculture that your application supports. Stattdessen können Sie eine einzelne Satellitenassembly für eine übergeordnete Kultur erstellen, die von allen verknüpften Subkulturen verwendet werden kann.Instead, you can create a single satellite assembly for a parent culture that all related subcultures can use. Sie können z.B eine einzelne englische Satellitenassembly (en) bereitstellen, die von Benutzern abgerufen wird, die regionsspezifische englische Ressourcen angefordert haben, und eine einzelne deutsche Satellitenassembly (de) für Benutzer, die regionsspezifische deutsche Ressourcen angefordert haben.For example, you can provide a single English satellite assembly (en) that is retrieved by users who request region-specific English resources, and a single German satellite assembly (de) for users who request region-specific German resources. Für Anforderungen von z.B. Deutsch, wie es in Deutschland (de-DE), in Österreich (de-AT) oder der Schweiz (de-CH) gesprochen wird, wird auf die deutsche Satellitenassembly (de) ausgewichen.For example, requests for German as spoken in Germany (de-DE), Austria (de-AT), and Switzerland (de-CH) would fall back to the German satellite assembly (de). Die Standardressourcen sind die endgültigen Fallbacks und sollten deshalb die Ressourcen sein, die von der Mehrheit der Benutzer Ihrer Anwendung angefordert werden. Achten Sie also darauf, welche Ressourcen Sie dafür auswählen.The default resources are the final fallback and therefore should be the resources that will be requested by the majority of your application's users, so choose these resources carefully. Bei dieser Vorgehensweise werden Ressourcen bereitgestellt, die weniger kulturspezifisch sind, aber die Lokalisierungskosten Ihrer Anwendung deutlich verringern können.This approach deploys resources that are less culturally specific, but can significantly reduce your application's localization costs.

Siehe auchSee also