Share via


Satellietassembly's maken voor .NET-apps

Resourcebestanden spelen een centrale rol in gelokaliseerde toepassingen. Ze maken het mogelijk dat een toepassing tekenreeksen, afbeeldingen en andere gegevens weergeeft in de taal en cultuur van de gebruiker en alternatieve gegevens biedt als bronnen voor de taal of cultuur van de gebruiker niet beschikbaar zijn. .NET maakt gebruik van een hub-and-spoke-model om gelokaliseerde resources te zoeken en op te halen. De hub is de belangrijkste assembly die de niet-lokaliseerbare uitvoerbare code en de resources voor één cultuur bevat, die de neutrale of standaardcultuur wordt genoemd. De standaardcultuur is de terugvalcultuur voor de toepassing; deze wordt gebruikt wanneer er geen gelokaliseerde resources beschikbaar zijn. U gebruikt het NeutralResourcesLanguageAttribute kenmerk om de cultuur van de standaardcultuur van de toepassing aan te wijzen. Elke spoke maakt verbinding met een satellietassembly die de resources voor één gelokaliseerde cultuur bevat, maar geen code bevat. Omdat de satellietassembly's geen deel uitmaken van de hoofdassembly, kunt u eenvoudig resources bijwerken of vervangen die overeenkomen met een specifieke cultuur zonder de hoofdassembly voor de toepassing te vervangen.

Notitie

De resources van de standaardcultuur van een toepassing kunnen ook worden opgeslagen in een satellietassembly. Hiervoor wijst u het NeutralResourcesLanguageAttribute kenmerk een waarde toe van UltimateResourceFallbackLocation.Satellite.

Naam en locatie van satellietassembly

Het hub-and-spoke-model vereist dat u resources op specifieke locaties plaatst, zodat ze gemakkelijk kunnen worden gevonden en gebruikt. Als u resources niet compileert en noemt zoals verwacht, of als u ze niet op de juiste locaties plaatst, kan de algemene taalruntime deze niet vinden en worden in plaats daarvan de resources van de standaardcultuur gebruikt. De .NET-resourcemanager wordt vertegenwoordigd door het ResourceManager type en wordt gebruikt om automatisch toegang te krijgen tot gelokaliseerde resources. De Resource Manager vereist het volgende:

  • Eén satellietassemblage moet alle middelen voor een bepaalde cultuur bevatten. Met andere woorden, u moet meerdere .txt- of .resx-bestanden compileren in één binair .resources-bestand.

  • Er moet een afzonderlijke submap in de toepassingsmap zijn voor elke gelokaliseerde cultuur waarin de resources van die cultuur worden opgeslagen. De naam van de submap moet gelijk zijn aan de naam van de cultuur. U kunt ook uw satellietassembly's opslaan in de globale assemblycache. In dit geval moet het cultuurinformatieonderdeel van de sterke naam van de assembly de cultuur aangeven. Zie Satellietassembly's installeren in de Global Assembly Cache voor meer informatie.

    Notitie

    Als uw toepassing resources voor subculturen bevat, plaatst u elke subcultuur in een afzonderlijke submap onder de toepassingsmap. Plaats subculturen niet in submappen onder de hoofdmap van de cultuur.

  • De satellietassembly moet dezelfde naam hebben als de toepassing en moet de bestandsnaamextensie '.resources.dll' gebruiken. Als een toepassing bijvoorbeeld Example.exe heet, moet de naam van elke satellietassembly worden Example.resources.dll. De naam van de satellietassembly geeft niet de cultuur van de bronbestanden aan. De satellietassembly wordt echter weergegeven in een map waarin de cultuur wordt opgegeven.

  • Informatie over de cultuur van de satellietassembly moet worden opgenomen in de metagegevens van de assembly. Als u de cultuurnaam wilt opslaan in de metagegevens van de satellietassembly, geeft u de /culture optie op wanneer u Assembly Linker gebruikt om resources in de satellietassembly in te sluiten.

In de volgende afbeelding ziet u een voorbeeldmapstructuur en locatievereisten voor toepassingen die u niet in de globale assemblycache installeert. De items met .txt - en .resources-extensies worden niet verzonden met de uiteindelijke toepassing. Dit zijn de tussenliggende resourcebestanden die worden gebruikt om de uiteindelijke satellietresourceassembly's te maken. In dit voorbeeld kunt u .resx-bestanden vervangen door de .txt-bestanden. Zie Resources verpakken en implementeren voor meer informatie.

In de volgende afbeelding ziet u de map satellietassembly:

Een satellietassemblymap met gelokaliseerde culturen submappen.

Satellietassembly's compileren

U gebruikt resourcebestandgenerator (resgen.exe) om tekstbestanden of XML-bestanden (.resx) te compileren die resources bevatten naar binaire .resources-bestanden . Vervolgens gebruikt u Assembly Linker (al.exe) om .resources-bestanden te compileren in satellietassembly's. al.exe maakt een assembly op basis van de .resources-bestanden die u opgeeft. Satellietassembly's mogen alleen middelen bevatten; ze kunnen geen uitvoerbare code bevatten.

Met de volgende al.exe opdracht maakt u een satellietassembly voor de toepassing Example op basis van de Duitse resources-bestand strings.de.resources.

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

Met de volgende al.exe opdracht wordt ook een satellietassembly voor de toepassing Example gemaakt op basis van de bestandsreeksen.de.resources. De optie /template zorgt ervoor dat de satellietassembly alle assemblymetagegevens overneemt, behalve de cultuurinformatie van de bovenliggende assembly (Example.dll).

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

In de volgende tabel worden de al.exe opties beschreven die in deze opdrachten worden gebruikt:

Optie Omschrijving
-target:lib Hiermee geeft u op dat uw satellietassembly is gecompileerd naar een bibliotheekbestand (.dll). Omdat een satellietassembly geen uitvoerbare code bevat en geen hoofdassembly van een toepassing is, moet u satellietassembly's opslaan als DLL's.
-embed:strings.de.resources Hiermee geeft u de naam op van het resourcebestand dat moet worden ingesloten wanneer al.exe de assembly compileert. U kunt meerdere .resources-bestanden insluiten in een satellietassembly, maar als u het hub-and-spoke-model volgt, moet u één satellietassembly compileren voor elke cultuur. U kunt echter afzonderlijke .resources-bestanden maken voor tekenreeksen en objecten.
-culture:de Hiermee geeft u de cultuur van de resource die moet worden gecompileerd. De algemene taalruntime gebruikt deze informatie wanneer er wordt gezocht naar de resources voor een opgegeven cultuur. Als u deze optie weglaat, wordt al.exe de resource nog steeds gecompileerd, maar kan de runtime deze niet vinden wanneer een gebruiker deze aanvraagt.
-out:Example.resources.dll Hiermee geeft u de naam van het uitvoerbestand. De naam moet de naamgevingsstandaard baseName.resources volgen.extensie, waarbij baseName de naam van de hoofdassembly en extensie is een geldige bestandsnaamextensie (zoals .dll). De runtime kan de cultuur van een satellietassembly niet bepalen op basis van de naam van het uitvoerbestand; u moet de optie /culture gebruiken om deze op te geven.
-template:Example.dll Hiermee geeft u een assembly van waaruit de satellietassembly alle assemblymetagegevens overneemt, behalve het cultuurveld. Deze optie is alleen van invloed op satellietassembly's als u een assembly opgeeft die een sterke naam heeft.

Zie Assembly Linker (al.exe) voor een volledige lijst met opties die beschikbaar zijn voor al.exe.

Notitie

Het kan voorkomen dat u de .NET Core MSBuild-taak wilt gebruiken om satellietassembly's te compileren, ook al richt u zich op .NET Framework. U kunt bijvoorbeeld deterministische optie van de C#-compiler gebruiken om assembly's uit verschillende builds te kunnen vergelijken. In dit geval stelt u GenerateSatelliteAssembliesForCore true in op in het .csproj-bestand om satellietassembly's te genereren met behulp van csc.exe in plaats van Al.exe (Assembly Linker).

<Project>
    <PropertyGroup>
        <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
    </PropertyGroup>
</Project>

De .NET Core MSBuild-taak maakt gebruik van csc.exe in plaats van al.exe om standaard satellietassembly's te genereren. Zie Voor meer informatie , maken het gemakkelijker om zich aan te kiezen voor "Core" satelliet assembly generatie.

Voorbeeld van satellietassembly's

Hier volgt een eenvoudig 'Hallo wereld'-voorbeeld waarin een berichtvak met een gelokaliseerde begroeting wordt weergegeven. Het voorbeeld bevat bronnen voor de Engelse culturen (Verenigde Staten), Frans (Frankrijk) en Russisch (Rusland) en de terugvalcultuur is Engels. Ga als volgt te werk om het voorbeeld te maken:

  1. Maak een resourcebestand met de naam Greeting.resx of Greeting.txt om de resource voor de standaardcultuur te bevatten. Sla één tekenreeks met de naam HelloString 'Hallo wereld!' op in dit bestand.

  2. Als u wilt aangeven dat Engels (en) de standaardcultuur van de toepassing is, voegt u het volgende System.Resources.NeutralResourcesLanguageAttribute kenmerk toe aan het AssemblyInfo-bestand van de toepassing of aan het belangrijkste broncodebestand dat wordt gecompileerd in de hoofdassembly van de toepassing.

    [assembly: NeutralResourcesLanguage("en")]
    
    <Assembly: NeutralResourcesLanguage("en")>
    
  3. Voeg als volgt ondersteuning toe voor extra culturen (en-USfr-FR, en ru-RU) aan de toepassing:

    • Maak een resourcebestand met de naam Greeting.en-US.resx of Greeting.en-US.txt om de en-US Engelse cultuur (Verenigde Staten) te ondersteunen en sla deze op in één tekenreeks met de naam HelloString 'Hi world!'.

    • Ter ondersteuning van de of Franse cultuur (Frankrijk) maakt u een resourcebestand met de fr-FR naam Greeting.fr-FR.resx of Greeting.fr-FR.txt en slaat u er één tekenreeks op met de naam HelloString "Salut tout le monde!".

    • Als u de of Russische cultuur (Rusland) wilt ondersteunen, maakt u een resourcebestand met de ru-RU naam Greeting.ru-RU.resx of Greeting.ru-RU.txt en slaat u er één tekenreeks op met de naam HelloString 'Всем привет!'.

  4. Gebruik resgen.exe om elk tekst- of XML-resourcebestand te compileren naar een binair .resources-bestand . De uitvoer is een set bestanden met dezelfde hoofdbestandsnaam als de .resx - of .txt-bestanden , maar de extensie .resources . Als u het voorbeeld maakt met Visual Studio, wordt het compilatieproces automatisch verwerkt. Als u Visual Studio niet gebruikt, voert u de volgende opdrachten uit om de RESX-bestanden te compileren in .resources-bestanden :

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

    Als uw resources zich in tekstbestanden in plaats van XML-bestanden bevinden, vervangt u de extensie .resx door .txt.

  5. Compileer de volgende broncode samen met de resources voor de standaardcultuur in de hoofdassembly van de toepassing:

    Belangrijk

    Als u de opdrachtregel gebruikt in plaats van Visual Studio om het voorbeeld te maken, moet u de aanroep naar de ResourceManager klasseconstructor als volgt wijzigen: ResourceManager rm = new ResourceManager("Greeting", 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.Greeting",
                                                      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
    

    Als de toepassing de naam Voorbeeld heeft en u compileert vanaf de opdrachtregel, is de opdracht voor de C#-compiler:

    csc Example.cs -res:Greeting.resources
    

    De bijbehorende Visual Basic-compileropdracht is:

    vbc Example.vb -res:Greeting.resources
    
  6. Maak een submap in de hoofdtoepassingsmap voor elke gelokaliseerde cultuur die door de toepassing wordt ondersteund. U moet een en-US, een fr-FR en een ru-RU-submap maken. Visual Studio maakt deze submappen automatisch als onderdeel van het compilatieproces.

  7. Sluit de afzonderlijke cultuurspecifieke .resources-bestanden in satellietassembly's in en sla ze op in de juiste map. De opdracht om dit te doen voor elk .resources-bestand is:

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

    waar cultuur de naam is van de cultuur waarvan de hulpbronnen de satellietassemblage bevat. Visual Studio verwerkt dit proces automatisch.

Vervolgens kunt u het voorbeeld uitvoeren. Het zal willekeurig een van de ondersteunde culturen de huidige cultuur maken en een gelokaliseerde begroeting weergeven.

Satellietassembly's installeren in de Global Assembly Cache

In plaats van assembly's te installeren in een submap van een lokale toepassing, kunt u deze installeren in de globale assemblycache. Dit is met name handig als u klassebibliotheken en klassebibliotheekresourceassembly's hebt die door meerdere toepassingen worden gebruikt.

Het installeren van assembly's in de globale assemblycache vereist dat ze sterke namen hebben. Sterk benoemde assembly's worden ondertekend met een geldig openbaar/persoonlijk sleutelpaar. Ze bevatten versie-informatie die de runtime gebruikt om te bepalen welke assembly moet worden gebruikt om te voldoen aan een bindingsaanvraag. Zie Assembly-versiebeheer voor meer informatie over sterke namen en versiebeheer. Zie Sterk benoemde assembly's voor meer informatie over sterke namen.

Wanneer u een toepassing ontwikkelt, is het onwaarschijnlijk dat u toegang hebt tot het laatste openbare/persoonlijke sleutelpaar. Als u een satellietassembly wilt installeren in de globale assemblycache en ervoor wilt zorgen dat deze werkt zoals verwacht, kunt u een techniek gebruiken die vertraagde ondertekening wordt genoemd. Wanneer u een assembly uitstellen, reserveert u tijdens het bouwen ruimte in het bestand voor de handtekening met sterke naam. De werkelijke ondertekening wordt uitgesteld tot later, wanneer het laatste openbare/persoonlijke sleutelpaar beschikbaar is. Zie Vertraagde ondertekening van een assembly uitstellen voor meer informatie over vertraagde ondertekening.

De openbare sleutel verkrijgen

Als u het ondertekenen van een assembly wilt vertragen, moet u toegang hebben tot de openbare sleutel. U kunt de echte openbare sleutel verkrijgen van de organisatie in uw bedrijf die de uiteindelijke ondertekening uitvoert of een openbare sleutel maken met behulp van het hulpprogramma Sterke naam (sn.exe).

Met de volgende Sn.exe opdracht wordt een openbaar/persoonlijk sleutelpaar gemaakt. De optie –k geeft aan dat Sn.exe een nieuw sleutelpaar moet maken en opslaan in een bestand met de naam TestKeyPair.snk.

sn –k TestKeyPair.snk

U kunt de openbare sleutel extraheren uit het bestand dat het testsleutelpaar bevat. Met de volgende opdracht wordt de openbare sleutel uit TestKeyPair.snk geëxtraheerd en opgeslagen in PublicKey.snk:

sn –p TestKeyPair.snk PublicKey.snk

Ondertekening van een assembly vertragen

Nadat u de openbare sleutel hebt verkregen of gemaakt, gebruikt u de Assembly Linker (al.exe) om de assembly te compileren en vertraagde ondertekening op te geven.

Met de volgende al.exe opdracht maakt u een sterk benoemde satellietassembly voor de toepassing StringLibrary uit het bestand strings.ja.resources :

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

De optie -delay+ geeft aan dat de Assembly Linker het teken van de assembly moet vertragen. Met de optie -keyfile geeft u de naam op van het sleutelbestand dat de openbare sleutel bevat die moet worden gebruikt om het ondertekenen van de assembly uit te stellen.

Een assembly opnieuw ondertekenen

Voordat u uw toepassing implementeert, moet u de vertraagde ondertekende satellietassembly opnieuw ondertekenen met het echte sleutelpaar. U kunt dit doen met behulp van Sn.exe.

De volgende Sn.exe opdracht ondertekent StringLibrary.resources.dll met het sleutelpaar dat is opgeslagen in het bestand RealKeyPair.snk. De optie –R geeft aan dat een eerder ondertekende of vertraagde assembly opnieuw moet worden ondertekend.

sn –R StringLibrary.resources.dll RealKeyPair.snk

Een satellietassembly installeren in de Global Assembly Cache

Wanneer de runtime zoekt naar resources in het terugvalproces van de resource, ziet deze eerst in de globale assemblycache . (Zie de sectie Resource Fallback Process van Resources verpakken en implementeren.) Zodra een satellietassembly is ondertekend met een sterke naam, kan deze worden geïnstalleerd in de globale assemblycache met behulp van het hulpprogramma Global Assembly Cache (gacutil.exe).

Met de volgende Gacutil.exe opdracht wordt StringLibrary.resources.dll* geïnstalleerd in de globale assemblycache:

gacutil -i:StringLibrary.resources.dll

De optie /i geeft aan dat Gacutil.exe de opgegeven assembly moet installeren in de globale assemblycache. Nadat de satellietassembly in de cache is geïnstalleerd, zijn de resources die deze bevat beschikbaar voor alle toepassingen die zijn ontworpen om de satellietassembly te gebruiken.

Resources in de Global Assembly Cache: een voorbeeld

In het volgende voorbeeld wordt een methode in een .NET-klassebibliotheek gebruikt om een gelokaliseerde begroeting uit een resourcebestand te extraheren en te retourneren. De bibliotheek en de bijbehorende resources worden geregistreerd in de globale assemblycache. Het voorbeeld bevat bronnen voor de Engelsen (Verenigde Staten), Frans (Frankrijk), Russisch (Rusland) en Engelse culturen. Engels is de standaardcultuur; de resources worden opgeslagen in de hoofdassembly. In het voorbeeld worden de bibliotheek en de bijbehorende satellietassembly's in eerste instantie met een openbare sleutel ondertekend en vervolgens opnieuw ondertekend met een openbaar/persoonlijk sleutelpaar. Ga als volgt te werk om het voorbeeld te maken:

  1. Als u Visual Studio niet gebruikt, gebruikt u de volgende opdracht Strong Name Tool (Sn.exe) om een openbaar/persoonlijk sleutelpaar met de naam ResKey.snk te maken:

    sn –k ResKey.snk
    

    Als u Visual Studio gebruikt, gebruikt u het tabblad Ondertekening van het dialoogvenster Projecteigenschappen om het sleutelbestand te genereren.

  2. Gebruik de volgende opdracht Strong Name Tool (Sn.exe) om een openbare-sleutelbestand met de naam PublicKey.snk te maken:

    sn –p ResKey.snk PublicKey.snk
    
  3. Maak een resourcebestand met de naam Strings.resx om de resource voor de standaardcultuur te bevatten. Sla in dat bestand één tekenreeks op met de naam Greeting waarvan de waarde 'Hoe moet u dit doen?'.

  4. Als u wilt aangeven dat 'en' de standaardcultuur van de toepassing is, voegt u het volgende System.Resources.NeutralResourcesLanguageAttribute kenmerk toe aan het AssemblyInfo-bestand van de toepassing of aan het belangrijkste broncodebestand dat wordt gecompileerd in de hoofdassembly van de toepassing:

    [assembly:NeutralResourcesLanguageAttribute("en")]
    
    <Assembly: NeutralResourcesLanguageAttribute("en")>
    
  5. Voeg als volgt ondersteuning toe voor extra culturen (de en-US-, fr-FR- en ru-RU-culturen) aan de toepassing:

    • Als u de cultuur 'en-US' of Engels (Verenigde Staten) wilt ondersteunen, maakt u een resourcebestand met de naam Strings.en-US.resx of Strings.en-US.txt en slaat u deze op in één tekenreeks met de naam Greeting 'Hallo!'.

    • Ter ondersteuning van de cultuur fr-FR of Frans (Frankrijk) maakt u een resourcebestand met de naam Strings.fr-FR.resx of Strings.fr-FR.txt en slaat u deze op in één tekenreeks met de naam Greeting 'Bon jour!'.

    • Als u de "ru-RU" of Russische cultuur (Rusland) wilt ondersteunen, maakt u een resourcebestand met de naam Strings.ru-RU.resx of Strings.ru-RU.txt en slaat u er één tekenreeks op met de naam Greeting Привет!.

  6. Gebruik resgen.exe om elk tekst- of XML-resourcebestand te compileren naar een binair .resources-bestand. De uitvoer is een set bestanden met dezelfde hoofdbestandsnaam als de .resx - of .txt-bestanden , maar de extensie .resources . Als u het voorbeeld maakt met Visual Studio, wordt het compilatieproces automatisch verwerkt. Als u Visual Studio niet gebruikt, voert u de volgende opdracht uit om de RESX-bestanden te compileren in .resources-bestanden :

    resgen filename
    

    Waar bestandsnaam het optionele pad, de bestandsnaam en de extensie van het .resx - of tekstbestand is.

  7. Compileer de volgende broncode voor StringLibrary.vb of StringLibrary.cs samen met de resources voor de standaardcultuur in een vertraagde ondertekende bibliotheekassembly met de naam StringLibrary.dll:

    Belangrijk

    Als u de opdrachtregel gebruikt in plaats van Visual Studio om het voorbeeld te maken, moet u de aanroep van de ResourceManager klasseconstructor wijzigen in 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
    

    De opdracht voor de C#-compiler is:

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

    De bijbehorende Visual Basic-compileropdracht is:

    vbc -t:library -resource:Strings.resources -delaysign+ -keyfile:publickey.snk StringLibrary.vb
    
  8. Maak een submap in de hoofdtoepassingsmap voor elke gelokaliseerde cultuur die door de toepassing wordt ondersteund. U moet een en-US, een fr-FR en een ru-RU-submap maken. Visual Studio maakt deze submappen automatisch als onderdeel van het compilatieproces. Omdat alle satellietassembly's dezelfde bestandsnaam hebben, worden de submappen gebruikt om afzonderlijke cultuurspecifieke satellietassembly's op te slaan totdat ze zijn ondertekend met een openbaar/persoonlijk sleutelpaar.

  9. Sluit de afzonderlijke cultuurspecifieke .resources-bestanden in om ondertekende satellietassembly's uit te stellen en op te slaan in de juiste map. De opdracht om dit te doen voor elk .resources-bestand is:

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

    waar cultuur de naam is van een cultuur. In dit voorbeeld zijn de cultuurnamen en-US, fr-FR en ru-RU.

  10. Onderteken StringLibrary.dll als volgt met behulp van het hulpmiddel Sterke naam (sn.exe):

    sn –R StringLibrary.dll RealKeyPair.snk
    
  11. De afzonderlijke satellietassembly's opnieuw ondertekenen. Gebruik hiervoor het hulpmiddel Strong Name (sn.exe) als volgt voor elke satellietassemblage:

    sn –R StringLibrary.resources.dll RealKeyPair.snk
    
  12. Registreer StringLibrary.dll en elk van de bijbehorende satellietassembly's in de globale assemblycache met behulp van de volgende opdracht:

    gacutil -i filename
    

    waarbij de bestandsnaam de naam is van het bestand dat moet worden geregistreerd.

  13. Als u Visual Studio gebruikt, maakt u een nieuw consoletoepassingsproject met de naam Example, voegt u een verwijzing naar StringLibrary.dll en de volgende broncode toe en compileert u deze.

    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
    

    Als u wilt compileren vanaf de opdrachtregel, gebruikt u de volgende opdracht voor de C#-compiler:

    csc Example.cs -r:StringLibrary.dll
    

    De opdrachtregel voor de Visual Basic-compiler is:

    vbc Example.vb -r:StringLibrary.dll
    
  14. Voer Example.exe uit.

Zie ook