Erstellen von Satellitenassemblys für Desktop-AppsCreating Satellite Assemblies for Desktop Apps

Ressourcendatei spielen eine tragende Rolle in lokalisierten Anwendungen.Resource files play a central role in localized applications. Durch sie kann eine Anwendung Zeichenfolgen, Images und andere Daten in der Sprache und Kultur des Benutzers anzeigen und alternative Daten bereitstellen, wenn keine Ressourcen für die Sprache oder Kultur des Benutzers verfügbar sind.They enable an application to display strings, images, and other data in the user's own language and culture, and to provide alternate data if resources for the user's own language or culture are unavailable. .NET Framework verwendet ein Speichenarchitekturmodell (Hub and Spoke), um lokalisierte Ressourcen zu finden und aufzurufen.The .NET Framework uses a hub-and-spoke model to locate and retrieve localized 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 non-localizable executable code and the resources for a single culture, which is called the neutral or default culture. Die Standardkultur ist die Ausweichkultur der Anwendung. Dabei handelt es sich um die Kultur, die verwendet wird, wenn keine lokalisierten Ressourcen verfügbar sind.The default culture is the fallback culture for the application; it is used when no localized resources are available. Sie verwenden das NeutralResourcesLanguageAttribute-Attribut, um die Standardkultur der Anwendung festzulegen.You use the NeutralResourcesLanguageAttribute attribute to designate the culture of the application's default culture. Jede Speiche ist mit einer Satellitenassembly verbunden, die die Ressourcen für eine einzelne lokalisierte Kultur aber keinen Code enthält.Each spoke connects to a satellite assembly that contains the resources for a single localized culture but does not contain any code. Da die Satellitenassemblys kein Teil der Hauptassembly sind, können Sie die Ressourcen problemlos entsprechend einer bestimmten Kultur ersetzen oder aktualisieren, ohne die Hauptassembly der App ersetzen zu müssen.Because the satellite assemblies are not part of the main assembly, you can easily update or replace resources that correspond to a specific culture without replacing the main assembly for the application.

Hinweis

Die Ressourcen der Standardkultur einer Anwendung können auch in einer Satellitenassembly gespeichert werden.The resources of an application's default culture can also be stored in a satellite assembly. Dazu weisen Sie dem NeutralResourcesLanguageAttribute-Attribut eine Wert von UltimateResourceFallbackLocation.Satellite zu.To do this, you assign the NeutralResourcesLanguageAttribute attribute a value of UltimateResourceFallbackLocation.Satellite.

Name und Speicherort einer SatellitenassemblySatellite Assembly Name and Location

Das Speichenarchitekturmodell erfordert, dass Sie Ressourcen an bestimmten Speicherorten speichern, damit Sie leicht gefunden und verwendet werden können.The hub-and-spoke model requires that you place resources in specific locations so that they can be easily located and used. Wenn Sie Ressourcen nicht wie erwartet kompilieren und benennen, oder wenn Sie sie nicht am richtigen Speicherort speichern, kann die Common Language Runtime diese nicht finden und verwendet stattdessen die Ressourcen der Standardkultur.If you do not compile and name resources as expected, or if you do not place them in the correct locations, the common language runtime will not be able to locate them and will use the resources of the default culture instead. Der Ressourcen-Manager von .NET Framework, der vom ResourceManager-Objekt dargestellt wird, wird verwendet, um automatisch auf lokalisierte Ressourcen zuzugreifen.The .NET Framework Resource Manager, represented by a ResourceManager object, is used to automatically access localized resources. Der Ressourcen-Manager hat folgende Anforderungen:The Resource Manager requires the following:

  • Eine einzelne Satellitenassembly muss alle Ressourcen für eine bestimmte Kultur enthalten.A single satellite assembly must include all the resources for a particular culture. Dies bedeutet, dass Sie mehrere TXT- oder RESX-Dateien in eine einzelne RESOURCES-Binärdatei kompilieren sollten.In other words, you should compile multiple .txt or .resx files into a single binary .resources file.

  • Das Anwendungsverzeichnis muss ein separates Unterverzeichnis für jede lokalisierte Kultur haben, in dem die Kulturressourcen gespeichert sind.There must be a separate subdirectory in the application directory for each localized culture that stores that culture's resources. Der Name des Unterverzeichnisses muss dem Namen der Kultur entsprechen.The subdirectory name must be the same as the culture name. Alternativ können Sie Ihre Satellitenassemblys im globalen Assemblycache (GAC) speichern.Alternately, you can store your satellite assemblies in the global assembly cache. In diesem Fall muss die Kulturinformationskomponente des starken Namens der Assembly deren Kultur angeben.In this case, the culture information component of the assembly's strong name must indicate its culture. (Weitere Informationen finden Sie im Abschnitt Installieren von Satellitenassemblys im globalen Assemblycache weiter unten in diesem Thema.)(See the Installing Satellite Assemblies in the Global Assembly Cache section later in this topic.)

    Hinweis

    Wenn Ihre Anwendung Ressourcen für Subkulturen enthält, platzieren Sie jede Subkultur in separaten Unterverzeichnisse im Anwendungsverzeichnis.If your application includes resources for subcultures, place each subculture in a separate subdirectory under the application directory. Platzieren Sie Subkulturen nicht in Unterverzeichnis im Hauptkulturverzeichnis.Do not place subcultures in subdirectories under their main culture's directory.

  • Die Satellitenassembly muss den gleichen Namen wie die Anwendung haben und muss das Suffix „.resources.dll“ verwenden.The satellite assembly must have the same name as the application, and must use the file name extension ".resources.dll". Wenn eine Anwendung z.B. „beispiel.exe“ heißt, sollte der Name jeder Satellitenassembly „beispiel.resources.dll“ sein.For example, if an application is named Example.exe, the name of each satellite assembly should be Example.resources.dll. Beachten Sie, dass der Name der Satellitenassembly nicht die Kultur seiner Ressourcendatei angibt.Note that the satellite assembly name does not indicate the culture of its resource files. Die Satellitenassembly wird aber in einem Verzeichnis angezeigt, das die Kultur angibt.However, the satellite assembly appears in a directory that does specify the culture.

  • Informationen zur Kultur der Satellitenassembly müssen in den Metadaten der Assembly enthalten sein.Information about the culture of the satellite assembly must be included in the assembly's metadata. Um den Namen der Kultur in den Assemblymetadaten zu speichern, geben Sie die /culture-Option an, wenn Sie den Assembly Linker verwenden, um Ressourcen in die Satellitenassembly einzubetten.To store the culture name in the satellite assembly's metadata, you specify the /culture option when you use Assembly Linker to embed resources in the satellite assembly.

Die folgende Abbildung zeigt eine beispielhafte Verzeichnisstruktur und Speicherortanforderungen für Anwendungen, die nicht im globalen Assemblycache installiert sind.The following illustration shows a sample directory structure and location requirements for applications that you are not installing in the global assembly cache. Die Elemente mit TXT- und RESOURCES-Suffixen werden nicht mit der fertigen Anwendung geliefert.The items with .txt and .resources extensions will not ship with the final application. Dabei handelt es sich nur um die vorläufigen Ressourcendateien, die dazu verwendet werden, die endgültigen Ressourcensatellitenassemblys zu erstellen.These are the intermediate resource files used to create the final satellite resource assemblies. In diesem Beispiel sollten Sie TXT-Dateien durch RESX-Dateien ersetzen.In this example, you could substitute .resx files for the .txt files. Weitere Informationen finden Sie unter Verpacken und Bereitstellen von Ressourcen.For more information, see Packaging and Deploying Resources.

Die folgende Abbildung zeigt die Satellitenassemblyverzeichnis:The following image shows the satellite assembly directory:

Eine Satellitenassemblyverzeichnis mit Unterverzeichnissen mit lokalisierten Kulturen.

Kompilieren von SatellitenassemblysCompiling Satellite Assemblies

Sie verwenden das Resources File Generator-Tool („resgen.exe“), um Text- oder XML-Dateien, die Ressourcen enthalten, in RESOURCES-Binärdateien zu kompilieren.You use Resource File Generator (Resgen.exe) to compile text files or XML (.resx) files that contain resources to binary .resources files. Anschließend verwenden Sie das Assembly Linker-Tool („al.exe“), um RESOURCES-Dateien in Satellitenassemblys zu kompilieren.You then use Assembly Linker (Al.exe) to compile .resources files into satellite assemblies. „Al.exe“ erstellt eine Assembly aus denen von Ihnen angegebenen RESOURCES-Dateien.Al.exe creates an assembly from the .resources files that you specify. Satellitenassemblys können nur Ressourcen enthalten. Sie können keinen ausführbaren Code enthalten.Satellite assemblies can contain only resources; they cannot contain any executable code.

Durch den folgenden Befehl von „al.exe“ wird eine Satellitenassembly für die Anwendung Example aus der deutschen Ressourcendatei „strings.de.resources“ erstellt.The following Al.exe command creates a satellite assembly for the application Example from the German resources file strings.de.resources.

al -target:lib -embed:strings.de.resources -culture:de -out:Example.resources.dll  

Durch den folgenden Befehl von „al.exe“ wird ebenfalls eine Satellitenassembly für die Anwendung Example aus der Datei „strings.de.resources“ erstellt.The following Al.exe command also creates a satellite assembly for the application Example from the file strings.de.resources. Die Option /template führt dazu, dass die Satellitenassembly alle Assemblymetadaten erbt. Davon ausgenommen ist die Kulturinformation der übergeordneten Assembly („beispiel.dll“).The /template option causes the satellite assembly to inherit all assembly metadata except for its culture information from the parent assembly (Example.dll).

al -target:lib -embed:strings.de.resources -culture:de -out:Example.resources.dll -template:Example.dll  

In der folgenden Tabelle werden die Optionen von „al.exe“ ausführlicher beschrieben, die in diesen Befehlen verwendet werden.The following table describes the Al.exe options used in these commands in more detail.

OptionOption BeschreibungDescription
-target: lib-target: lib Gibt an, dass Ihre Satellitenassembly in einer Bibliotheksdatei (.dll) kompiliert ist.Specifies that your satellite assembly is compiled to a library (.dll) file. Da eine Satellitenassembly keinen ausführbaren Code enthält und nicht die Hauptassembly einer Anwendung ist, müssen Sie Satellitenassemblys als DLLs speichern.Because a satellite assembly does not contain executable code and is not an application's main assembly, you must save satellite assemblies as DLLs.
-embed: strings.de.resources-embed: strings.de.resources Gibt den Namen der einzubettenden Ressourcendatei an, wenn „al.exe“ die Assembly kompiliert.Specifies the name of the resource file to embed when Al.exe compiles the assembly. Sie können mehrere RESOURCEN-Dateien in einer Satellitenassembly einbetten. Wenn Sie allerdings das Speichenarchitekturmodell einsetzen, müssen Sie eine Satellitenassembly für jede Kultur kompilieren.You can embed multiple .resources files in a satellite assembly, but if you are following the hub-and-spoke model, you must compile one satellite assembly for each culture. Sie können allerdings separate RESOURCES-Dateien für Zeichenfolgen und Objekte erstellen.However, you can create separate .resources files for strings and objects.
-culture: de-culture: de Gibt die Kultur der zu kompilierenden Datei an.Specifies the culture of the resource to compile. Die Common Language Runtime verwendet diese Information beim Suchen nach Ressourcen für eine angegebene Kultur.The common language runtime uses this information when it searches for the resources for a specified culture. Wenn Sie diese Option weglassen, kompiliert „al.exe“ die Ressource trotzdem, aber die Runtime kann diese nicht finden, wenn Sie von einem Benutzer angefordert wird.If you omit this option, Al.exe will still compile the resource, but the runtime will not be able to find it when a user requests it.
-out: Example.resources.dll-out: Example.resources.dll Gibt den Namen der Ausgabedatei an.Specifies the name of the output file. Der Name muss dem Benennungsstandard basisname.resources.dateiendung entsprechen, wobei basisname der Name der Hauptassembly ist und dateiendung ein gültiges Suffix (wie z.B. „.dll“).The name must follow the naming standard baseName.resources.extension, where baseName is the name of the main assembly and extension is a valid file name extension (such as .dll). Beachten Sie, dass die Runtime die Kultur einer Satellitenassembly nicht anhand des Namens der Ausgabedatei der Assembly bestimmen kann. Dazu müssen Sie die Option /culture verwenden.Note that the runtime is not able to determine the culture of a satellite assembly based on its output file name; you must use the /culture option to specify it.
-template: Example.dll-template: Example.dll Legt eine Assembly fest, von der die Satellitenassembly alle Assemblymetadaten erbt, mit Ausnahme des Felds für die Kultur.Specifies an assembly from which the satellite assembly will inherit all assembly metadata except the culture field. Diese Option wirkt sich nur auf Satellitenassemblys aus, wenn Sie eine Assembly mit einem starken Namen angeben.This option affects satellite assemblies only if you specify an assembly that has a strong name.

Eine vollständige Liste der Optionen von „al.exe“ finden Sie unter Assembly Linker (Al.exe).For a complete list of options available with Al.exe, see Assembly Linker (Al.exe).

Satellitenassemblys: BeispielSatellite Assemblies: An Example

Das folgende ist ein einfaches „Hello world“-Beispiel, in dem ein Meldungsfeld mit einer lokalisierten Begrüßung angezeigt wird.The following is a simple "Hello world" example that displays a message box containing a localized greeting. Das Beispiel enthält Ressourcen für die Kulturen Englisch (USA), Französisch (Frankreich) und Russisch (Russische Föderation). Die Fallback-Kultur ist Englisch.The example includes resources for the English (United States), French (France), and Russian (Russia) cultures, and its fallback culture is English. Gehen Sie folgendermaßen vor, um dieses Beispiel zu erstellen:To create the example, do the following:

  1. Erstellen Sie eine Ressourcendatei mit dem Namen „greeting.resx“ oder „greeting.txt“, die die Ressource für die Standardkultur enthalten soll.Create a resource file named Greeting.resx or Greeting.txt to contain the resource for the default culture. Speichern Sie in dieser Datei eine einzelne Zeichenfolge mit dem Namen HelloString, die den Wert „Hello world!“Store a single string named HelloString whose value is "Hello world!" hat.in this file.

  2. Um anzugeben, dass Englisch (en) die Standardkultur der Anwendung ist, fügen Sie folgendes System.Resources.NeutralResourcesLanguageAttribute-Attribut in die AssemblyInfo-Datei der Anwendung oder in die Hauptquellcodedatei hinzu, die in die Hauptassembly der Anwendung kompiliert werden.To indicate that English (en) is the application's default culture, add the following System.Resources.NeutralResourcesLanguageAttribute attribute to the application's AssemblyInfo file or to the main source code file that will be compiled into the application's main assembly.

    [assembly: NeutralResourcesLanguageAttribute("en")]
    
    <Assembly: NeutralResourcesLanguageAttribute("en")>
    
  3. Fügen Sie Unterstützung für weitere Kulturen (en-US, fr-FR und ru-RU) wie folgt in der Anwendung hinzu:Add support for additional cultures (en-US, fr-FR, and ru-RU) to the application as follows:

    • Um die Kultur „en-US“ bzw. Englisch (USA) zu unterstützen, erstellen Sie eine Ressourcendatei mit dem Namen „greeting.en-US.resx“ oder „greeting.en-US.txt“, und speichern Sie eine einzelne Zeichenfolge mit dem Namen HelloString in dieser, deren Wert „Hi world!“ istTo support the en-US or English (United States) culture, create a resource file named Greeting.en-US.resx or Greeting.en-US.txt, and store in it a single string named HelloString whose value is "Hi world!"

    • Um die Kultur „fr-FR“ bzw. Französisch (Frankreich) zu unterstützen, erstellen Sie eine Ressourcendatei mit dem Namen „greeting.fr-FR.resx“ oder „greeting.fr-FR.txt“, und speichern Sie eine einzelne Zeichenfolge mit dem Namen HelloString in dieser, deren Wert „Salut tout le monde!“ ist.To support the fr-FR or French (France) culture, create a resource file named Greeting.fr-FR.resx or Greeting.fr-FR.txt, and store in it a single string named HelloString whose value is "Salut tout le monde!"

    • Um die Kultur „ru-RU“ bzw. Russisch (Russland) zu unterstützen, erstellen Sie eine Ressourcendatei mit dem Namen „greeting.ru-RU.resx“ oder „greeting.ru-RU.txt“, und speichern Sie eine einzelne Zeichenfolge mit dem Namen HelloString in dieser, deren Wert „Всем привет!“ ist.To support the ru-RU or Russian (Russia) culture, create a resource file named Greeting.ru-RU.resx or Greeting.ru-RU.txt, and store in it a single string named HelloString whose value is "Всем привет!"

  4. Kompilieren Sie mit resgen.exe jede Text- oder XML-Ressourcendatei in eine RESOURCES-Binärdatei.Use Resgen.exe to compile each text or XML resource file to a binary .resources file. Die Ausgabe ist ein Satz von Dateien, die den gleichen Stammdateinamen wie die RESX- oder TXT-Dateien haben, aber mit der Dateiendung „.resources“.The output is a set of files that have the same root file name as the .resx or .txt files, but a .resources extension. Wenn Sie ein Beispiel mit Visual Studio erstellen, wird das Kompilieren automatisch behandelt.If you create the example with Visual Studio, the compilation process is handled automatically. Wenn Sie Visual Studio verwenden, führen Sie die folgenden Befehle aus, um die RESX-Dateien in RESOURCES-Dateien zu kompilieren:If you aren't using Visual Studio, run the following commands to compile the .resx files into .resources files:

    resgen Greeting.resx  
    resgen Greeting.en-us.resx  
    resgen Greeting.fr-FR.resx  
    resgen Greeting.ru-RU.resx  
    

    Wenn sich Ihre Ressourcen in Textdateien und nicht in XML-Dateien befinden, ersetzen Sie die Dateiendung „.resx“ durch „.txt“.If your resources are in text files instead of XML files, replace the .resx extension with .txt.

  5. Kompilieren Sie folgenden Quellcode zusammen mit den Ressourcen für die Standardkultur in die Hauptassembly der Anwendung:Compile the following source code along with the resources for the default culture into the application's main assembly:

    Wichtig

    Wenn Sie die Befehlszeile und nicht Visual Studio zum Erstellen des Beispiels verwenden, sollten Sie den Aufruf des ResourceManager-Klassenkonstruktors in das Folgende ändern: ResourceManager rm = new ResourceManager("Greetings", typeof(Example).Assembly);.If you are using the command line rather than Visual Studio to create the example, you should modify the call to the ResourceManager class constructor to the following: ResourceManager rm = new ResourceManager("Greetings", typeof(Example).Assembly);

    using System;
    using System.Globalization;
    using System.Reflection;
    using System.Resources;
    using System.Threading;
    using System.Windows.Forms;
    
    class Example
    {
       static void Main()
       {
          // Create array of supported cultures
          string[] cultures = {"en-CA", "en-US", "fr-FR", "ru-RU"};
          Random rnd = new Random();
          int cultureNdx = rnd.Next(0, cultures.Length);
          CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;
    
          try {
             CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
             Thread.CurrentThread.CurrentCulture = newCulture;
             Thread.CurrentThread.CurrentUICulture = newCulture;
             ResourceManager rm = new ResourceManager("Example.Greetings", 
                                                      typeof(Example).Assembly); 
             string greeting = String.Format("The current culture is {0}.\n{1}",
                                             Thread.CurrentThread.CurrentUICulture.Name,
                                             rm.GetString("HelloString"));
    
             MessageBox.Show(greeting);
          }
          catch (CultureNotFoundException e) {
             Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
          }
          finally {
             Thread.CurrentThread.CurrentCulture = originalCulture;
             Thread.CurrentThread.CurrentUICulture = originalCulture;
          }
       }
    }
    
    Imports System.Globalization
    Imports System.Resources
    Imports System.Threading
    
    Module Module1
    
       Sub Main()
          ' Create array of supported cultures
          Dim cultures() As String = {"en-CA", "en-US", "fr-FR", "ru-RU" }
          Dim rnd As New Random()
          Dim cultureNdx As Integer = rnd.Next(0, cultures.Length)
          Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture
    
          Try
             Dim newCulture As New CultureInfo(cultures(cultureNdx))
             Thread.CurrentThread.CurrentCulture = newCulture
             Thread.CurrentThread.CurrentUICulture = newCulture
             Dim greeting As String = String.Format("The current culture is {0}.{1}{2}",
                                                    Thread.CurrentThread.CurrentUICulture.Name,
                                                    vbCrLf, My.Resources.Greetings.HelloString)
    
             MsgBox(greeting)
          Catch e As CultureNotFoundException
             Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName)
          Finally
             Thread.CurrentThread.CurrentCulture = originalCulture
             Thread.CurrentThread.CurrentUICulture = originalCulture
          End Try
       End Sub
    End Module
    

    Wenn die Anwendung „Beispiel“ heißt, und Sie aus der Befehlszeile kompilieren, lautet der Befehl für den C#-Compiler wie folgt:If the application is named Example and you are compiling from the command line, the command for the C# compiler is:

    csc Example.cs -res:Greeting.resources  
    

    Der entsprechende Befehl für den Visual Basic-Compiler lautet:The corresponding Visual Basic compiler command is:

    vbc Example.vb -res:Greeting.resources  
    
  6. Erstellen Sie für jede lokalisierte, von der Anwendung unterstützte Kultur ein Unterverzeichnis im Hauptverzeichnis der Anwendung.Create a subdirectory in the main application directory for each localized culture supported by the application. Sie sollten die Unterverzeichnisse en-US, fr-FR und ru-RU erstellen.You should create an en-US, an fr-FR, and an ru-RU subdirectory. Visual Studio erstellt diese Unterverzeichnisse automatisch während des Kompiliervorgangs.Visual Studio creates these subdirectories automatically as part of the compilation process.

  7. Betten Sie die einzelnen kulturspezifischen RESOURCES-Dateien in Satellitenassemblys ein, und speichern Sie diese in die entsprechenden Verzeichnisse.Embed the individual culture-specific .resources files into satellite assemblies and save them to the appropriate directory. Dafür lautet der Befehl für jede RESOURCES-Datei:The command to do this for each .resources file is:

    al -target:lib -embed:Greeting.culture.resources -culture:culture -out:culture\Example.resources.dll  
    

    Wobei culture der Name der Kultur ist, deren Ressourcen die Satellitenassembly enthält.where culture is the name of the culture whose resources the satellite assembly contains. Dieser Vorgang wird von Visual Studio automatisch behandelt.Visual Studio handles this process automatically.

Anschließend können Sie das Beispiel ausführen.You can then run the example. Eine der unterstützten Kulturen wird willkürlich als aktuelle Kultur festgelegt. Dann wird eine lokalisierte Begrüßung angezeigt.It will randomly make one of the supported cultures the current culture and display a localized greeting.

Installieren von Satellitenassemblys im globalen AssemblycacheInstalling Satellite Assemblies in the Global Assembly Cache

Statt Assemblys in einem lokalen Unterverzeichnis der Anwendung zu installieren, können Sie diese auch im globalen Assemblycache (GAC) installieren.Instead of installing assemblies in a local application subdirectory, you can install them in the global assembly cache. Dies ist besonders dann praktisch, wenn Sie Klassenbibliotheken und Ressourcenassemblys von Klassenbibliotheken haben, die von mehreren Anwendungen verwendet werden.This is particularly useful if you have class libraries and class library resource assemblies that are used by multiple applications.

Wenn Sie Assemblys im GAC installieren möchten, müssen diese einen starken Namen aufweisen.Installing assemblies in the global assembly cache requires that they have strong names. Assemblys mit starkem Namen werden mit einem gültigen Paar aus privatem und öffentlichem Schlüssel signiert.Strong-named assemblies are signed with a valid public/private key pair. Sie enthalten Versionsinformationen, die die Runtime verwendet, um zu bestimmen, welche Assembly sie verwenden kann, um eine Bindungsanforderung zu erfüllen.They contain version information that the runtime uses to determine which assembly to use to satisfy a binding request. Weitere Informationen zu starken Namen und zur Versionskontrolle finden Sie unter Assembly Versioning (Assemblyversionskontrolle).For more information about strong names and versioning, see Assembly Versioning. Weitere Informationen zu starken Namen finden Sie unter Strong-Named Assemblies (Assemblys mit starkem Namen).For more information about strong names, see Strong-Named Assemblies.

Es ist unwahrscheinlich, dass Sie beim Entwickeln einer Anwendung Zugriff auf das endgültige Paar aus privatem und öffentlichem Schlüssel haben.When you are developing an application, it is unlikely that you will have access to the final public/private key pair. Um eine Assembly im GAC zu installieren und sicherzustellen, dass sie wie erwartet funktioniert, können Sie das sogenannte verzögerte Signieren verwenden.In order to install a satellite assembly in the global assembly cache and ensure that it works as expected, you can use a technique called delayed signing. Wenn Sie eine Assembly zum Zeitpunkt der Erstellung verzögert signieren, reservieren Sie Speicherplatz in der Datei für die starke Namenssignatur.When you delay sign an assembly, at build time you reserve space in the file for the strong name signature. Die tatsächliche Signatur wird auf einen späteren Zeitpunkt verschoben, wenn das Paar aus privatem und öffentlichem Schlüssel zur Verfügung steht.The actual signing is delayed until later, when the final public/private key pair is available. Weitere Informationen zum verzögerten Signieren finden Sie unter Delay Signing an Assembly (Verzögertes Signieren einer Assembly).For more information about delayed signing, see Delay Signing an Assembly.

Abrufen des öffentlichen SchlüsselsObtaining the Public Key

Um eine Assembly verzögert zu signieren, müssen Sie auf den öffentlichen Schlüssel zugreifen können.To delay sign an assembly, you must have access to the public key. Sie können entweder den tatsächlichen öffentlichen Schlüssel von der Organisation in Ihrem Unternehmen abrufen, der das Signieren später durchführen wird, oder einen öffentlichen Schlüssel mit dem Strong Name-Tool (Sn.exe) erstellen.You can either obtain the real public key from the organization in your company that will do the eventual signing, or create a public key by using the Strong Name Tool (Sn.exe).

Der folgende Befehl von „sn.exe“ erstellt einen Testpaar aus privatem und öffentlichem Schlüssel.The following Sn.exe command creates a test public/private key pair. Die Option –k gibt an, dass „sn.exe“ ein neues Schlüsselpaar erstellen und dieses in einer Datei mit dem Namen „TestKeyPair.snk“ speichern sollte.The –k option specifies that Sn.exe should create a new key pair and save it in a file named TestKeyPair.snk.

sn –k TestKeyPair.snk   

Sie können den öffentlichen Schlüssel aus der Datei extrahieren, die das Testschlüsselpaar enthält.You can extract the public key from the file that contains the test key pair. Der folgende Befehl extrahiert den öffentlichen Schlüssel aus „TestKeyPair.snk“ und speichert ihn in „PublicKey.snk“:The following command extracts the public key from TestKeyPair.snk and saves it in PublicKey.snk:

sn –p TestKeyPair.snk PublicKey.snk  

Verzögertes Signieren einer AssemblyDelay Signing an Assembly

Nachdem Sie einen öffentlichen Schlüssel abgerufen oder erstellt haben, verwenden Sie den Assembly Linker (Al.exe), um die Assembly zu kompilieren und das verzögerte Signieren anzugeben.After you obtain or create the public key, you use the Assembly Linker (Al.exe) to compile the assembly and specify delayed signing.

Durch den folgenden Befehl von „al.exe“ wird eine Satellitenassembly mit starkem Namen für die Anwendung „StringLibrary“ aus der Ressourcendatei „strings.ja.resources“ erstellt:The following Al.exe command creates a strong-named satellite assembly for the application StringLibrary from the strings.ja.resources file:

al -target:lib -embed:strings.ja.resources -culture:ja -out:StringLibrary.resources.dll -delay+ -keyfile:PublicKey.snk  

Die Option -delay+ gibt an, dass der Assembly Linker die Assembly verzögert signieren sollte.The -delay+ option specifies that the Assembly Linker should delay sign the assembly. Die Option -keyfile gibt den Namen der zu verwendenden Schlüsseldatei an, die den öffentlichen Schlüssel enthält, um die Assembly verzögert zu signieren.The -keyfile option specifies the name of the key file that contains the public key to use to delay sign the assembly.

Erneutes Signieren einer AssemblyRe-signing an Assembly

Bevor Sie Ihre Anwendung bereitstellen, müssen Sie die verzögert signierte Satellitenassembly erneut mit dem tatsächlichen Schlüsselpaar signieren.Before you deploy your application, you must re-sign the delay signed satellite assembly with the real key pair. Hierzu können Sie „sn.exe“ verwenden.You can do this by using Sn.exe.

Der folgende Befehl von „sn.exe“ signiert „StringLibrary.resources.dll“ mit dem Schlüsselpaar, das in der Datei „RealKeyPair.snk“ gespeichert ist.The following Sn.exe command signs StringLibrary.resources.dll with the key pair stored in the file RealKeyPair.snk. Die Option –R gibt an, dass eine bereits signierte oder verzögert signierte Assembly erneut signiert werden soll.The –R option specifies that a previously signed or delay signed assembly is to be re-signed.

sn –R StringLibrary.resources.dll RealKeyPair.snk   

Installieren einer Satellitenassembly im globalen AssemblycacheInstalling a Satellite Assembly in the Global Assembly Cache

Wenn die Runtime nach einer Ressource im Ressourcenfallback-Prozess sucht, durchsucht sie den GAC als Erstes.When the runtime searches for resources in the resource fallback process, it looks in the global assembly cache first. (Weitere Informationen finden Sie im Abschnitt „Ressourcenfallback-Prozess“ in Packaging and Deploying Resources (Verpacken und Bereitstellen von Ressourcen)) Sobald die Satellitenassembly mit einem starken Namen signiert wurde, kann Sie im GAC mit dem Global Assembly Cache-Tool (Gacutil.exe) installiert werden.(For more information, see the "Resource Fallback Process" section of the Packaging and Deploying Resources topic.) As soon as a satellite assembly is signed with a strong name, it can be installed in the global assembly cache by using the Global Assembly Cache Tool (Gacutil.exe).

Der folgende Befehl von „gacutil.exe“ installiert „StringLibrary.resources.dll“ im GAC:The following Gacutil.exe command installs StringLibrary.resources.dll in the global assembly cache:

gacutil -i:StringLibrary.resources.dll  

Die Option /i gibt an, dass „gacutil.exe“ die angegeben Assembly im GAC installieren soll.The /i option specifies that Gacutil.exe should install the specified assembly into the global assembly cache. Nachdem die Satellitenassembly im Cache installiert wurde, werden die Ressourcen, die sie enthält, für alle Anwendungen verfügbar gemacht, die dafür entwickelt wurden, die Satellitenassembly zu verwenden.After the satellite assembly is installed in the cache, the resources it contains become available to all applications that are designed to use the satellite assembly.

Ressourcen im globalen Assemblycache: BeispielResources in the Global Assembly Cache: An Example

In folgendem Beispiel wird eine Methode in der .NET Framework-Klassenbibliothek verwendet, um eine lokalisierte Begrüßung aus einer Ressourcendatei zu extrahieren und zurückzugeben.The following example uses a method in a .NET Framework class library to extract and return a localized greeting from a resource file. Die Bibliothek und ihre Ressourcen werden im GAC registriert.The library and its resources are registered in the global assembly cache. Das Beispiel enthält Ressourcen für die Kulturen Englisch (USA), Französisch (Frankreich), Russisch (Russland) und englische Kulturen.The example includes resources for the English (United States), French (France), Russian (Russia), and English cultures. Englisch ist die Standardkultur. Ihre Ressourcen sind in der Hauptassembly gespeichert.English is the default culture; its resources are stored in the main assembly. Im Beispiel werden die Bibliothek und ihre Satellitenassemblys zunächst mit einem öffentlichen Schlüssel verzögert signiert. Anschließend werden Sie mit einem Paar aus privatem und öffentlichem Schlüssel erneut signiert.The example initially delay signs the library and its satellite assemblies with a public key, then re-signs them with a public/private key pair. Gehen Sie folgendermaßen vor, um dieses Beispiel zu erstellen:To create the example, do the following:

  1. Wenn Sie nicht Visual Studio verwenden, verwenden Sie den folgenden Befehl vom Strong Name-Tool (Sn.exe), um ein Paar aus privatem und öffentlichem Schlüssel mit dem Namen „ResKey.snk“ zu erstellen:If you are not using Visual Studio, use the following Strong Name Tool (Sn.exe) command to create a public/private key pair named ResKey.snk:

    sn –k ResKey.snk  
    

    Wenn Sie Visual Studio verwenden, verwenden Sie die Registerkarte Signierung des Projektdialogfelds Eigenschaften, um die Schlüsseldatei zu generieren.If you are using Visual Studio, use the Signing tab of the project Properties dialog box to generate the key file.

  2. Verwenden Sie den folgenden Befehl vom Strong Name-Tool (Sn.exe), um eine öffentliche Schlüsseldatei mit dem Namen „PublicKey.snk“ zu erstellen:Use the following Strong Name Tool (Sn.exe) command to create a public key file named PublicKey.snk:

    sn –p ResKey.snk PublicKey.snk  
    
  3. Erstellen Sie eine Ressourcendatei mit dem Namen „strings.resx“, die die Ressource für die Standardkultur enthalten soll.Create a resource file named Strings.resx to contain the resource for the default culture. Speichern Sie in dieser Datei eine einzelne Zeichenfolge mit dem Namen Greeting, die den Wert „How do you do?“Store a single string named Greeting whose value is "How do you do?" hat.in that file.

  4. Um anzugeben, dass „en“ die Standardkultur der Anwendung ist, fügen Sie folgendes System.Resources.NeutralResourcesLanguageAttribute-Attribut in die AssemblyInfo-Datei der Anwendung oder in die Hauptquellcodedatei hinzu, die in die Hauptassembly der Anwendung kompiliert werden:To indicate that "en" is the application's default culture, add the following System.Resources.NeutralResourcesLanguageAttribute attribute to the application's AssemblyInfo file or to the main source code file that will be compiled into the application's main assembly:

    [assembly:NeutralResourcesLanguageAttribute("en")]
    
    <Assembly:NeutralResourcesLanguageAttribute("en")>
    
  5. Fügen Sie Unterstützung für weitere Kulturen (en-US, fr-FR und ru-RU) wie folgt in der Anwendung hinzu:Add support for additional cultures (the en-US, fr-FR, and ru-RU cultures) to the application as follows:

    • Um die Kultur „en-US“ bzw. Englisch (USA) zu unterstützen, erstellen Sie eine Ressourcendatei mit dem Namen „strings.en-US.resx“ oder „strings.en-US.txt“, und speichern Sie eine einzelne Zeichenfolge mit dem Namen Greeting in dieser, deren Wert „Hello!“ ist.To support the "en-US" or English (United States) culture, create a resource file named Strings.en-US.resx or Strings.en-US.txt, and store in it a single string named Greeting whose value is "Hello!".

    • Um die Kultur „fr-FR“ bzw. Französisch (Frankreich) zu unterstützen, erstellen Sie eine Ressourcendatei mit dem Namen „strings.fr-FR.resx“ oder „strings.fr-FR.txt“, und speichern Sie eine einzelne Zeichenfolge mit dem Namen Greeting in dieser, deren Wert „Bon jour!“ ist.To support the "fr-FR" or French (France) culture, create a resource file named Strings.fr-FR.resx or Strings.fr-FR.txt and store in it a single string named Greeting whose value is "Bon jour!"

    • Um die Kultur „ru-RU“ bzw. Russisch (Russland) zu unterstützen, erstellen Sie eine Ressourcendatei mit dem Namen „strings.ru-RU.resx“ oder „strings.ru-RU.txt“, und speichern Sie eine einzelne Zeichenfolge mit dem Namen Greeting in dieser, deren Wert „Привет!“ ist.To support the "ru-RU" or Russian (Russia) culture, create a resource file named Strings.ru-RU.resx or Strings.ru-RU.txt and store in it a single string named Greeting whose value is "Привет!"

  6. Kompilieren Sie mit resgen.exe jede Text- oder XML-Ressourcendatei in eine RESOURCES-Binärdatei.Use Resgen.exe to compile each text or XML resource file to a binary .resources file. Die Ausgabe ist ein Satz von Dateien, die den gleichen Stammdateinamen wie die RESX- oder TXT-Dateien haben, aber mit der Dateiendung „.resources“.The output is a set of files that have the same root file name as the .resx or .txt files, but a .resources extension. Wenn Sie ein Beispiel mit Visual Studio erstellen, wird das Kompilieren automatisch behandelt.If you create the example with Visual Studio, the compilation process is handled automatically. Wenn Sie Visual Studio nicht verwenden, führen Sie den folgenden Befehl aus, um die RESX-Dateien in RESOURCES-Dateien zu kompilieren:If you aren't using Visual Studio, run the following command to compile the .resx files into .resources files:

    resgen filename  
    

    Wobei es sich bei filename um den optionalen Pfad, den optionalen Dateinamen und die optionale Dateiendung der RESX- oder TXT-Datei handelt.where filename is the optional path, file name, and extension of the .resx or text file.

  7. Kompilieren Sie den folgenden Quellcode für „StringLibrary.cs“ zusammen mit den Ressourcen der Standardkultur in eine verzögert signierte Bibliotheksassembly mit dem Namen „StringLibrary.dll“:Compile the following source code for StringLibrary.vb or StringLibrary.cs along with the resources for the default culture into a delay signed library assembly named StringLibrary.dll:

    Wichtig

    Wenn Sie die Befehlszeile statt Visual Studio zum Erstellen des Beispiels verwenden, sollten Sie den Aufruf des ResourceManager-Klassenkonstruktors in ResourceManager rm = new ResourceManager("Strings", typeof(Example).Assembly); ändern.If you are using the command line rather than Visual Studio to create the example, you should modify the call to the ResourceManager class constructor to ResourceManager rm = new ResourceManager("Strings", typeof(Example).Assembly);.

    using System;
    using System.Globalization;
    using System.Reflection;
    using System.Resources;
    using System.Threading;
    
    [assembly:NeutralResourcesLanguageAttribute("en")]
    
    public class StringLibrary
    {
       public string GetGreeting()
       {
          ResourceManager rm = new ResourceManager("Strings", 
                               Assembly.GetAssembly(typeof(StringLibrary)));
          string greeting = rm.GetString("Greeting");
          return greeting;
       }
    }
    
    Imports System.Globalization
    Imports System.Reflection
    Imports System.Resources
    Imports System.Threading
    
    <Assembly:NeutralResourcesLanguageAttribute("en")>
    
    Public Class StringLibrary
       Public Function GetGreeting() As String
          Dim rm As New ResourceManager("Strings", _
                                        Assembly.GetAssembly(GetType(StringLibrary)))
          Dim greeting As String = rm.GetString("Greeting")
          Return greeting
       End Function
    End Class
    

    Der Befehl für den C#-Compiler lautet:The command for the C# compiler is:

    csc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.cs  
    

    Der entsprechende Befehl für den Visual Basic-Compiler lautet:The corresponding Visual Basic compiler command is:

    vbc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.vb  
    
  8. Erstellen Sie für jede lokalisierte, von der Anwendung unterstützte Kultur ein Unterverzeichnis im Hauptverzeichnis der Anwendung.Create a subdirectory in the main application directory for each localized culture supported by the application. Sie sollten die Unterverzeichnisse en-US, fr-FR und ru-RU erstellen.You should create an en-US, an fr-FR, and an ru-RU subdirectory. Visual Studio erstellt diese Unterverzeichnisse automatisch während des Kompiliervorgangs.Visual Studio creates these subdirectories automatically as part of the compilation process. Da alle Satellitenassemblys den gleichen Dateinamen haben, werden die Unterverzeichnisse verwendet, um einzelne kulturspezifische Satellitenassemblys zu speichern, bis sie mit einem Paar aus privatem und öffentlichem Schlüssel signiert werden.Because all satellite assemblies have the same file name, the subdirectories are used to store individual culture-specific satellite assemblies until they are signed with a public/private key pair.

  9. Betten Sie die einzelnen kulturspezifischen RESOURCES-Dateien in die verzögert signierten Satellitenassemblys ein, und speichern Sie diese in die entsprechenden Verzeichnisse.Embed the individual culture-specific .resources files into delay signed satellite assemblies and save them to the appropriate directory. Dafür lautet der Befehl für jede RESOURCES-Datei:The command to do this for each .resources file is:

    al -target:lib -embed:Strings.culture.resources -culture:culture -out:culture\StringLibrary.resources.dll -delay+ -keyfile:publickey.snk  
    

    Wobei culture der Name der Kultur ist.where culture is the name of a culture. In diesem Beispiel sind die Kulturnamen „en-US“, „fr-FR“ und „ru-RU“.In this example, the culture names are en-US, fr-FR, and ru-RU.

  10. Signieren Sie „StringLibrary.dll“ erneut, indem Sie das Strong Name-Tool (Sn.exe) wie folgt verwenden:Re-sign StringLibrary.dll by using the Strong Name Tool (Sn.exe) as follows:

    sn –R StringLibrary.dll RealKeyPair.snk  
    
  11. Signieren Sie die einzelnen Satellitenassemblys erneut.Re-sign the individual satellite assemblies. Verwenden Sie dafür das Strong Name-Tool (Sn.exe) für jede Satellitenassembly wie folgt:To do this, use the Strong Name Tool (Sn.exe) as follows for each satellite assembly:

    sn –R StringLibrary.resources.dll RealKeyPair.snk  
    
  12. Registrieren Sie „StringLibrary.dll“ und die dazugehörigen Satellitenassemblys im GAC mit dem folgenden Befehl:Register StringLibrary.dll and each of its satellite assemblies in the global assembly cache by using the following command:

    gacutil -i filename  
    

    Wobei filename der Name der zu registrierenden Datei ist.where filename is the name of the file to register.

  13. Wenn Sie Visual Studio verwenden, erstellen Sie ein neues Konsolenanwendungsprojekt mit dem Namen Example, fügen Sie einen Verweis auf „StringLibrary.dll“ und folgenden Quellcode hinzu, und kompilieren Sie.If you are using Visual Studio, create a new Console Application project named Example, add a reference to StringLibrary.dll and the following source code to it, and compile.

    using System;
    using System.Globalization;
    using System.Threading;
    
    public class Example
    {
       public static void Main()
       {
          string[] cultureNames = { "en-GB", "en-US", "fr-FR", "ru-RU" };
          Random rnd = new Random();
          string cultureName = cultureNames[rnd.Next(0, cultureNames.Length)]; 
          Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
          Console.WriteLine("The current UI culture is {0}", 
                            Thread.CurrentThread.CurrentUICulture.Name);
          StringLibrary strLib = new StringLibrary();
          string greeting = strLib.GetGreeting();
          Console.WriteLine(greeting);
       }
    }
    
    Imports System.Globalization
    Imports System.Threading
    
    Module Example
       Public Sub Main()
          Dim cultureNames() As String = { "en-GB", "en-US", "fr-FR", "ru-RU" }
          Dim rnd As New Random()
          Dim cultureName As String = cultureNames(rnd.Next(0, cultureNames.Length)) 
          Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
          Console.WriteLine("The current UI culture is {0}", 
                            Thread.CurrentThread.CurrentUICulture.Name)
          Dim strLib As New StringLibrary()
          Dim greeting As String = strLib.GetGreeting()
          Console.WriteLine(greeting)
       End Sub
    End Module
    

    Um aus der Befehlszeile zu kompilieren, verwenden Sie folgenden Befehl für den C#-Compiler:To compile from the command line, use the following command for the C# compiler:

    csc Example.cs -r:StringLibrary.dll   
    

    Die Befehlszeile für den Visual Basic-Compiler lautet:The command line for the Visual Basic compiler is:

    vbc Example.vb -r:StringLibrary.dll   
    
  14. Führen Sie „Beispiel.exe“ aus.Run Example.exe.

Siehe auchSee also