System.Resources.ResourceManager classe

Este artigo fornece observações complementares à documentação de referência para essa API.

Importante

Chamar métodos desta classe quando você tiver dados não confiáveis é um risco à segurança. Chame os métodos dessa classe somente quando você tiver dados confiáveis. Para obter mais informações, consulte Validar todas as entradas.

A ResourceManager classe recupera recursos de um arquivo .resources binário que está incorporado em um assembly ou de um arquivo .resources autônomo. Se um aplicativo tiver sido localizado e recursos localizados tiverem sido implantados em assemblies satélites, ele procurará recursos específicos da cultura, fornecerá fallback de recursos quando um recurso localizado não existir e dará suporte à serialização de recursos.

Aplicativos da área de trabalho

Para aplicativos de área de trabalho, a ResourceManager classe recupera recursos de arquivos de recurso binário (.resources). Normalmente, um compilador de linguagem ou o Assembly Linker (AL.exe) incorpora esses arquivos de recurso em um assembly. Você também pode usar um objeto para recuperar recursos diretamente de um arquivo .resources que não está incorporado em um ResourceManager assembly, chamando o CreateFileBasedResourceManager método.

Cuidado

O uso de arquivos .resources autônomos em um aplicativo ASP.NET interromperá a implantação do XCOPY, pois os recursos permanecerão bloqueados até que sejam liberados explicitamente pelo ReleaseAllResources método. Se você quiser implantar recursos com seus aplicativos ASP.NET, deverá compilar seus arquivos .resources em assemblies satélites.

Em um aplicativo baseado em recursos, um arquivo .resources contém os recursos da cultura padrão cujos recursos são usados se nenhum recurso específico da cultura puder ser encontrado. Por exemplo, se a cultura padrão de um aplicativo for inglês (en), os recursos do idioma inglês serão usados sempre que não for possível encontrar recursos localizados para uma cultura específica, como inglês (Estados Unidos) (en-US) ou francês (França) (fr-FR). Normalmente, os recursos para a cultura padrão são incorporados no assembly do aplicativo principal e os recursos para outras culturas localizadas são incorporados em assemblies satélite. Os assemblies de satélite contêm apenas recursos. Eles têm o mesmo nome de arquivo raiz que o assembly principal e uma extensão de .resources.dll. Para aplicativos cujos assemblies não estão registrados no cache global de assemblies, os assemblies satélites são armazenados em um subdiretório de aplicativo cujo nome corresponde à cultura do assembly.

Criar recursos

Ao desenvolver um aplicativo baseado em recursos, você armazena informações de recursos em arquivos de texto (arquivos que têm uma extensão .txt ou .restext) ou arquivos XML (arquivos que têm uma extensão .resx). Em seguida, compile os arquivos de texto ou XML com o gerador de arquivos de recurso (Resgen.exe) para criar um arquivo .resources binário. Em seguida, você pode incorporar o arquivo .resources resultante em um executável ou biblioteca usando uma opção de compilador, como /resources para os compiladores C# e Visual Basic, ou você pode incorporá-lo em um assembly satélite usando o Assembly Linker (AI.exe). Se você incluir um arquivo .resx em seu projeto do Visual Studio, o Visual Studio manipulará a compilação e a incorporação de recursos padrão e localizados automaticamente como parte do processo de compilação.

Idealmente, você deve criar recursos para cada idioma compatível com seu aplicativo ou, pelo menos, para um subconjunto significativo de cada idioma. Os nomes de arquivo binários .resources seguem o nome base da convenção de nomenclatura.cultureName.resources, onde basename é o nome do aplicativo ou o nome de uma classe, dependendo do nível de detalhes desejado. A CultureInfo.Name propriedade é usada para determinar cultureName. Um recurso para a cultura padrão do aplicativo deve ser chamado basename.resources.

Por exemplo, suponha que um assembly tenha vários recursos em um arquivo de recurso que tenha o nome base MyResources. Esses arquivos de recurso devem ter nomes como MyResources.ja-JP.resources para a cultura japonesa, MyResources.de.resources para a cultura alemã, MyResources.zh-CHS.resources para a cultura chinesa simplificada e MyResources.fr-BE.resources para a cultura francesa (Bélgica). O arquivo de recurso padrão deve ser chamado MyResources.resources. Os arquivos de recursos específicos da cultura são geralmente empacotados em montagens satélites para cada cultura. O arquivo de recurso padrão deve ser incorporado no assembly principal do aplicativo.

Observe que o Assembly Linker permite que os recursos sejam marcados como privados, mas você sempre deve marcá-los como públicos para que possam ser acessados por outros assemblies. (Como um assembly satélite não contém código, os recursos marcados como privados não estão disponíveis para seu aplicativo por meio de qualquer mecanismo.)

Para obter mais informações sobre como criar, empacotar e implantar recursos, consulte os artigos Criando arquivos de recursos, Criando assemblies satélite e Empacotando e implantando recursos.

Instanciar um objeto ResourceManager

Você instancia um objeto que recupera recursos de um ResourceManager arquivo .resources incorporado chamando uma de suas sobrecargas de construtor de classe. Isso acopla firmemente um objeto a um ResourceManager arquivo .resources específico e a qualquer arquivo .resources localizado associado em assemblies satélite.

Os dois construtores mais comumente chamados são:

  • ResourceManager(String, Assembly) Procura recursos com base em duas informações fornecidas: o nome base do arquivo .resources e o assembly no qual o arquivo .resources padrão. O nome base inclui o namespace e o nome raiz do arquivo .resources, sem sua cultura ou extensão. Observe que os arquivos .resources que são compilados da linha de comando normalmente não incluem um nome de namespace, enquanto os arquivos .resources que são criados no ambiente do Visual Studio o fazem. Por exemplo, se um arquivo de recurso é chamado MyCompany.StringResources.resources e o construtor é chamado de um método estático chamado Example.Main, o ResourceManager código a seguir instancia um ResourceManager objeto que pode recuperar recursos do arquivo .resources:

    ResourceManager rm = new ResourceManager("MyCompany.StringResources",
                                             typeof(Example).Assembly);
    
    Dim rm As New ResourceManager("MyCompany.StringResources",
                                GetType(Example2).Assembly)
    
  • ResourceManager(Type) Procura recursos em assemblies satélite com base em informações de um objeto Type. O nome totalmente qualificado do tipo corresponde ao nome base do arquivo .resources sem sua extensão de nome de arquivo. Em aplicativos de área de trabalho que são criados usando o Visual Studio Resource Designer, Visual Studio cria uma classe wrapper cujo nome totalmente qualificado é o mesmo que o nome raiz do arquivo .resources. Por exemplo, se um arquivo de recurso for chamado MyCompany.StringResources.resources e houver uma classe wrapper chamada MyCompany.StringResources, o código a seguir instanciará um ResourceManager objeto que pode recuperar recursos do arquivo .resources:

    ResourceManager rm = new ResourceManager(typeof(MyCompany.StringResources));
    
    Dim rm As New ResourceManager(GetType(MyCompany.StringResources))
    

Se os recursos apropriados não puderem ser encontrados, a chamada do construtor criará um objeto válido ResourceManager . No entanto, a tentativa de recuperar um recurso lança uma MissingManifestResourceException exceção. Para obter informações sobre como lidar com a exceção, consulte a seção Handle MissingManifestResourceException e MissingSatelliteAssemblyException Exceptions mais adiante neste artigo.

O exemplo a seguir mostra como instanciar um ResourceManager objeto. Ele contém o código-fonte de um executável chamado ShowTime.exe. Ele também inclui o seguinte arquivo de texto chamado Strings.txt que contém um único recurso de cadeia de caracteres, TimeHeader:

TimeHeader=The current time is

Você pode usar um arquivo em lotes para gerar o arquivo de recurso e incorporá-lo ao executável. Aqui está o arquivo em lotes para gerar um executável usando o compilador C#:

resgen strings.txt
csc ShowTime.cs /resource:strings.resources

Para o compilador do Visual Basic, você pode usar o seguinte arquivo em lotes:

resgen strings.txt
vbc ShowTime.vb /resource:strings.resources
using System;
using System.Resources;

public class ShowTimeEx
{
    public static void Main()
    {
        ResourceManager rm = new ResourceManager("Strings",
                                 typeof(Example).Assembly);
        string timeString = rm.GetString("TimeHeader");
        Console.WriteLine("{0} {1:T}", timeString, DateTime.Now);
    }
}
// The example displays output like the following:
//        The current time is 2:03:14 PM
Imports System.Resources

Module Example6
    Public Sub Main()
        Dim rm As New ResourceManager("Strings", GetType(Example6).Assembly)
        Dim timeString As String = rm.GetString("TimeHeader")
        Console.WriteLine("{0} {1:T}", timeString, Date.Now)
    End Sub
End Module
' The example displays output similar to the following:
'       The current time is 2:03:14 PM

ResourceManager e recursos específicos da cultura

Um aplicativo localizado requer que os recursos sejam implantados, conforme discutido no artigo Empacotando e implantando recursos. Se os assemblies estiverem configurados corretamente, o gerenciador de recursos determinará quais recursos recuperar com base na propriedade do Thread.CurrentUICulture thread atual. (Essa propriedade também retorna a cultura de interface do usuário do thread atual.) Por exemplo, se um aplicativo for compilado com recursos de idioma inglês padrão no assembly principal e com recursos de idioma francês e russo em dois assemblies satélites, e a Thread.CurrentUICulture propriedade estiver definida como fr-FR, o gerenciador de recursos recuperará os recursos em francês.

Você pode definir a CurrentUICulture propriedade explícita ou implicitamente. A maneira como você o define determina como o ResourceManager objeto recupera recursos com base na cultura:

  • Se você definir explicitamente a Thread.CurrentUICulture propriedade para uma cultura específica, o gerenciador de recursos sempre recuperará os recursos para essa cultura, independentemente do navegador do usuário ou do idioma do sistema operacional. Considere um aplicativo compilado com recursos padrão de idioma inglês e três assemblies satélites que contêm recursos para inglês (Estados Unidos), francês (França) e russo (Rússia). Se a CurrentUICulture propriedade for definida como fr-FR, o objeto sempre recuperará os recursos em francês (França), mesmo que o ResourceManager idioma do sistema operacional do usuário não seja francês. Certifique-se de que este é o comportamento desejado antes de definir a propriedade explicitamente.

    Em aplicativos ASP.NET, você deve definir a Thread.CurrentUICulture propriedade explicitamente, porque é improvável que a configuração no servidor corresponda às solicitações de entrada do cliente. Um aplicativo ASP.NET pode definir a Thread.CurrentUICulture propriedade explicitamente para o idioma de aceitação do navegador do usuário.

    A configuração explícita da Thread.CurrentUICulture propriedade define a cultura de interface do usuário atual para esse thread. Ele não afeta a cultura atual da interface do usuário de nenhum outro thread em um aplicativo.

  • Você pode definir a cultura da interface do usuário de todos os threads em um domínio de aplicativo atribuindo um CultureInfo objeto que representa essa cultura à propriedade estática CultureInfo.DefaultThreadCurrentUICulture .

  • Se você não definir explicitamente a cultura de interface do usuário atual e não definir uma cultura padrão para o domínio do aplicativo atual, a CultureInfo.CurrentUICulture propriedade será definida implicitamente pela função do Windows GetUserDefaultUILanguage . Essa função é fornecida pela MUI (Multilingual User Interface), que permite que o usuário defina o idioma padrão. Se o idioma da interface do usuário não for definido pelo usuário, ele assumirá como padrão o idioma instalado pelo sistema, que é o idioma dos recursos do sistema operacional.

O exemplo simples de "Hello world" a seguir define a cultura atual da interface do usuário explicitamente. Ele contém recursos para três culturas: inglês (Estados Unidos) ou en-US, francês (França) ou fr-FR, e russo (Rússia) ou ru-RU. Os recursos en-US estão contidos em um arquivo de texto chamado Greetings.txt:

HelloString=Hello world!

Os recursos fr-FR estão contidos em um arquivo de texto chamado Greetings.fr-FR.txt:

HelloString=Salut tout le monde!

Os recursos ru-RU estão contidos em um arquivo de texto chamado Greetings.ru-RU.txt:

HelloString=Всем привет!

Aqui está o código-fonte para o exemplo (Example.vb para a versão do Visual Basic ou Example.cs para a versão C#):

using System;
using System.Globalization;
using System.Resources;
using System.Threading;

public class Example
{
    public 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;
        ResourceManager rm = new ResourceManager("Greetings", typeof(Example).Assembly);
        try
        {
            CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
            Thread.CurrentThread.CurrentCulture = newCulture;
            Thread.CurrentThread.CurrentUICulture = newCulture;
            string greeting = String.Format("The current culture is {0}.\n{1}",
                                            Thread.CurrentThread.CurrentUICulture.Name,
                                            rm.GetString("HelloString"));
            Console.WriteLine(greeting);
        }
        catch (CultureNotFoundException e)
        {
            Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
        }
        finally
        {
            Thread.CurrentThread.CurrentCulture = originalCulture;
            Thread.CurrentThread.CurrentUICulture = originalCulture;
        }
    }
}
// The example displays output like the following:
//       The current culture is ru-RU.
//       Всем привет!
Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Example
   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
      Dim rm As New ResourceManager("Greetings", GetType(Example).Assembly)
      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, rm.GetString("HelloString"))

         Console.WriteLine(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
' The example displays output like the following:
'       The current culture is ru-RU.
'       Всем привет!

Para compilar este exemplo, crie um arquivo em lotes (.bat) que contenha os seguintes comandos e execute-o no prompt de comando. Se você estiver usando C#, especifique csc em vez de vbc e Example.cs em vez de Example.vb.

resgen Greetings.txt
vbc Example.vb /resource:Greetings.resources

resgen Greetings.fr-FR.txt
Md fr-FR
al /embed:Greetings.fr-FR.resources /culture:fr-FR /out:fr-FR\Example.resources.dll

resgen Greetings.ru-RU.txt
Md ru-RU
al /embed:Greetings.ru-RU.resources /culture:ru-RU /out:ru-RU\Example.resources.dll

Recuperar recursos

Você chama os GetObject(String) métodos e GetString(String) para acessar um recurso específico. Você também pode chamar o GetStream(String) método para recuperar recursos que não são de cadeia de caracteres como uma matriz de bytes. Por padrão, em um aplicativo que tenha recursos localizados, esses métodos retornam o recurso para a cultura determinada pela cultura de interface do usuário atual do thread que fez a chamada. Consulte a seção anterior, ResourceManager e recursos específicos de cultura, para obter mais informações sobre como a cultura de interface do usuário atual de um thread é definida. Se o gerenciador de recursos não conseguir localizar o recurso para a cultura de interface do usuário do thread atual, ele usará um processo de fallback para recuperar o recurso especificado. Se o gerenciador de recursos não conseguir localizar nenhum recurso localizado, ele usará os recursos da cultura padrão. Para obter mais informações sobre regras de fallback de recursos, consulte a seção "Processo de fallback de recursos" do artigo Empacotando e implantando recursos.

Observação

Se o arquivo .resources especificado no construtor de ResourceManager classe não puder ser encontrado, a tentativa de recuperar um recurso lançará uma MissingManifestResourceException ou MissingSatelliteAssemblyException exceção. Para obter informações sobre como lidar com a exceção, consulte a seção Handle MissingManifestResourceException e MissingSatelliteAssemblyException Exceptions mais adiante neste artigo.

O exemplo a seguir usa o GetString método para recuperar recursos específicos da cultura. Consiste em recursos compilados a partir de arquivos .txt para as culturas inglesa (en), francesa (França) (fr-FR) e russa (Rússia) (ru-RU). O exemplo altera a cultura atual e a cultura atual da interface do usuário para inglês (Estados Unidos), francês (França), russo (Rússia) e sueco (Suécia). Em seguida, ele chama o método para recuperar a cadeia de caracteres localizada, que exibe junto com o dia e o GetString mês atuais. Observe que a saída exibe a cadeia de caracteres localizada apropriada, exceto quando a cultura atual da interface do usuário é sueca (Suécia). Como os recursos do idioma sueco não estão disponíveis, o aplicativo usa os recursos da cultura padrão, que é o inglês.

O exemplo requer os arquivos de recursos baseados em texto listados na tabela a seguir. Cada um tem um único recurso de cadeia de caracteres chamado DateStart.

Cultura Nome do arquivo Nome do recurso Valor do recurso
en-US DateStrings.txt DateStart Hoje é
fr-FR DateStrings.fr-FR.txt DateStart Aujourd'hui, c'est le
ru-RU DateStrings.ru-RU.txt DateStart Сегодня

Aqui está o código-fonte para o exemplo (ShowDate.vb para a versão do Visual Basic ou ShowDate.cs para a versão C# do código).

using System;
using System.Globalization;
using System.Resources;
using System.Threading;

[assembly: NeutralResourcesLanguage("en")]

public class ShowDateEx
{
    public static void Main()
    {
        string[] cultureNames = { "en-US", "fr-FR", "ru-RU", "sv-SE" };
        ResourceManager rm = new ResourceManager("DateStrings",
                                                 typeof(Example).Assembly);

        foreach (var cultureName in cultureNames)
        {
            CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;

            Console.WriteLine("Current UI Culture: {0}",
                              CultureInfo.CurrentUICulture.Name);
            string dateString = rm.GetString("DateStart");
            Console.WriteLine("{0} {1:M}.\n", dateString, DateTime.Now);
        }
    }
}
// The example displays output similar to the following:
//       Current UI Culture: en-US
//       Today is February 03.
//       
//       Current UI Culture: fr-FR
//       Aujourd'hui, c'est le 3 février
//       
//       Current UI Culture: ru-RU
//       Сегодня февраля 03.
//       
//       Current UI Culture: sv-SE
//       Today is den 3 februari.
Imports System.Globalization
Imports System.Resources
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example5
    Public Sub Main()
        Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE"}
        Dim rm As New ResourceManager("DateStrings",
                                    GetType(Example5).Assembly)

        For Each cultureName In cultureNames
            Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
            Thread.CurrentThread.CurrentCulture = culture
            Thread.CurrentThread.CurrentUICulture = culture

            Console.WriteLine("Current UI Culture: {0}",
                           CultureInfo.CurrentUICulture.Name)
            Dim dateString As String = rm.GetString("DateStart")
            Console.WriteLine("{0} {1:M}.", dateString, Date.Now)
            Console.WriteLine()
        Next
    End Sub
End Module
' The example displays output similar to the following:
'       Current UI Culture: en-US
'       Today is February 03.
'       
'       Current UI Culture: fr-FR
'       Aujourd'hui, c'est le 3 février
'       
'       Current UI Culture: ru-RU
'       Сегодня февраля 03.
'       
'       Current UI Culture: sv-SE
'       Today is den 3 februari.

Para compilar este exemplo, crie um arquivo em lotes que contenha os seguintes comandos e execute-o no prompt de comando. Se você estiver usando C#, especifique csc em vez de vbc e showdate.cs em vez de showdate.vb.

resgen DateStrings.txt
vbc showdate.vb /resource:DateStrings.resources

md fr-FR
resgen DateStrings.fr-FR.txt
al /out:fr-FR\Showdate.resources.dll /culture:fr-FR /embed:DateStrings.fr-FR.resources

md ru-RU
resgen DateStrings.ru-RU.txt
al /out:ru-RU\Showdate.resources.dll /culture:ru-RU /embed:DateStrings.ru-RU.resources

Há duas maneiras de recuperar os recursos de uma cultura específica diferente da cultura de interface do usuário atual:

  • Você pode chamar o GetString(String, CultureInfo)método , GetObject(String, CultureInfo)ou GetStream(String, CultureInfo) para recuperar um recurso para uma cultura específica. Se um recurso localizado não puder ser encontrado, o gerenciador de recursos usará o processo de fallback do recurso para localizar um recurso apropriado.
  • Você pode chamar o GetResourceSet método para obter um ResourceSet objeto que representa os recursos para uma cultura específica. Na chamada de método, você pode determinar se o gerenciador de recursos investiga culturas pai se não conseguir localizar recursos localizados ou se simplesmente retorna aos recursos da cultura padrão. Em seguida, você pode usar os métodos para acessar os ResourceSet recursos (localizados para essa cultura) por nome ou para enumerar os recursos no conjunto.

Manipular exceções MissingManifestResourceException e MissingSatelliteAssemblyException

Se você tentar recuperar um recurso específico, mas o gerenciador de recursos não conseguir localizar esse recurso e nenhuma cultura padrão tiver sido definida ou os recursos da cultura padrão não puderem ser localizados, o gerenciador de recursos lançará uma MissingManifestResourceException exceção se ele espera localizar os recursos no assembly principal ou um MissingSatelliteAssemblyException se ele espera encontrar os recursos em um assembly satélite. Observe que a exceção é lançada quando você chama um método de recuperação de recursos, como GetString ou GetObject, e não quando você instancia um ResourceManager objeto.

A exceção normalmente é lançada sob as seguintes condições:

  • O arquivo de recurso apropriado ou o assembly satélite não existe. Se o gerenciador de recursos espera que os recursos padrão do aplicativo sejam incorporados no assembly do aplicativo principal, eles estão ausentes. Se o NeutralResourcesLanguageAttribute atributo indicar que os recursos padrão do aplicativo residem em um assembly satélite, esse assembly não poderá ser encontrado. Ao compilar seu aplicativo, verifique se os recursos estão incorporados no assembly principal ou se o assembly satélite necessário é gerado e nomeado adequadamente. Seu nome deve assumir a forma appName.resources.dll e deve estar localizado em um diretório com o nome da cultura cujos recursos ele contém.

  • Seu aplicativo não tem uma cultura padrão ou neutra definida. Adicione o NeutralResourcesLanguageAttribute atributo a um arquivo de código-fonte ou ao arquivo de informações do projeto (AssemblyInfo.vb para um aplicativo Visual Basic ou AssemblyInfo.cs para um aplicativo C#).

  • O baseName parâmetro no ResourceManager(String, Assembly) construtor não especifica o nome de um arquivo .resources. O nome deve incluir o namespace totalmente qualificado do arquivo de recurso, mas não sua extensão de nome de arquivo. Normalmente, os arquivos de recurso que são criados no Visual Studio incluem nomes de namespace, mas os arquivos de recurso que são criados e compilados no prompt de comando não. Você pode determinar os nomes dos arquivos .resources incorporados compilando e executando o seguinte utilitário. Este é um aplicativo de console que aceita o nome de um assembly principal ou assembly satélite como um parâmetro de linha de comando. Ele exibe as cadeias de caracteres que devem ser fornecidas como o parâmetro para que o gerenciador de recursos possa identificar corretamente o baseName recurso.

    using System;
    using System.IO;
    using System.Reflection;
    
    public class Example0
    {
       public static void Main()
       {
          if (Environment.GetCommandLineArgs().Length == 1) { 
             Console.WriteLine("No filename.");
             return;
          }
          
          string filename = Environment.GetCommandLineArgs()[1].Trim();
          // Check whether the file exists.
          if (! File.Exists(filename)) {
             Console.WriteLine("{0} does not exist.", filename);
             return;
          }   
          
          // Try to load the assembly.
          Assembly assem = Assembly.LoadFrom(filename);
          Console.WriteLine("File: {0}", filename);
             
          // Enumerate the resource files.
          string[] resNames = assem.GetManifestResourceNames();
          if (resNames.Length == 0)
             Console.WriteLine("   No resources found.");
    
          foreach (var resName in resNames)
             Console.WriteLine("   Resource: {0}", resName.Replace(".resources", ""));
    
          Console.WriteLine();
       }
    }
    
    Imports System.IO
    Imports System.Reflection
    Imports System.Resources
    
    Module Example
       Public Sub Main()
          If Environment.GetCommandLineArgs.Length = 1 Then 
             Console.WriteLine("No filename.")
             Exit Sub
          End If
          Dim filename As String = Environment.GetCommandLineArgs(1).Trim()
          ' Check whether the file exists.
          If Not File.Exists(filename) Then
             Console.WriteLine("{0} does not exist.", filename)
             Exit Sub
          End If   
          
          ' Try to load the assembly.
          Dim assem As Assembly = Assembly.LoadFrom(filename)
          Console.WriteLine("File: {0}", filename)
             
          ' Enumerate the resource files.
          Dim resNames() As String = assem.GetManifestResourceNames()
          If resNames.Length = 0 Then
             Console.WriteLine("   No resources found.")
          End If
          For Each resName In resNames
             Console.WriteLine("   Resource: {0}", resName.Replace(".resources", ""))
          Next
          Console.WriteLine()
       End Sub
    End Module
    

Se você estiver alterando a cultura atual do seu aplicativo explicitamente, lembre-se também de que o gerenciador de recursos recupera um conjunto de recursos com base no valor da CultureInfo.CurrentUICulture propriedade, e não na CultureInfo.CurrentCulture propriedade. Normalmente, se você alterar um valor, também deverá alterar o outro.

Controle de versão do recurso

Como o assembly principal que contém os recursos padrão de um aplicativo é separado dos assemblies satélites do aplicativo, você pode lançar uma nova versão do assembly principal sem reimplantar os assemblies satélites. Use o atributo para usar assemblies satélites existentes e instrua o SatelliteContractVersionAttribute gerenciador de recursos a não reimplantá-los com uma nova versão do assembly principal,

Para obter mais informações sobre o suporte de controle de versão para assemblies satélite, consulte o artigo Recuperando recursos.

<Nó do arquivo de configuração SatelliteAssemblies>

Observação

Esta seção é específica para aplicativos do .NET Framework.

Para executáveis implantados e executados a partir de um site (arquivos .exe HREF), o objeto pode investigar assemblies satélite na Web, o que pode prejudicar o ResourceManager desempenho do aplicativo. Para eliminar o problema de desempenho, você pode limitar essa investigação aos assemblies satélite implantados com seu aplicativo. Para fazer isso, você cria um nó no arquivo de configuração do aplicativo para especificar que implantou um <satelliteassemblies> conjunto específico de culturas para seu aplicativo e que o ResourceManager objeto não deve tentar investigar qualquer cultura que não esteja listada nesse nó.

Observação

A alternativa preferencial para criar um <satelliteassemblies> nó é usar o recurso Manifesto de Implantação do ClickOnce.

No arquivo de configuração do seu aplicativo, crie uma seção semelhante à seguinte:

<?xml version ="1.0"?>
<configuration>
  <satelliteassemblies>
    <assembly name="MainAssemblyName, Version=versionNumber, Culture=neutral, PublicKeyToken=null|yourPublicKeyToken">
      <culture>cultureName1</culture>
      <culture>cultureName2</culture>
      <culture>cultureName3</culture>
    </assembly>
  </satelliteassemblies>
</configuration>

Edite essas informações de configuração da seguinte maneira:

  • Especifique um ou mais <assembly> nós para cada assembly principal implantado, onde cada nó especifica um nome de assembly totalmente qualificado. Especifique o nome do assembly principal no lugar de MainAssemblyName e especifique os Versionvalores de atributo , PublicKeyTokene Culture que correspondem ao assembly principal.

    Para o atributo, especifique o Version número da versão do assembly. Por exemplo, a primeira versão do assembly pode ser o número da versão 1.0.0.0.

    Para o atributo, especifique a palavra-chave se você não tiver assinado o assembly com um nome forte ou especifique o token de chave null pública se tiver assinado o PublicKeyToken assembly.

    Para o atributo, especifique a palavra-chave neutral para designar o Culture assembly principal e faça com que a ResourceManager classe examine somente as culturas listadas nos <culture> nós.

    Para obter mais informações sobre nomes de assembly totalmente qualificados, consulte o artigo Nomes de assembly. Para obter mais informações sobre assemblies de nome forte, consulte o artigo Criar e usar assemblies de nome forte.

  • Especifique um ou mais <culture> nós com um nome de cultura específico, como "fr-FR", ou um nome de cultura neutro, como "fr".

Se forem necessários recursos para qualquer assembly não listado <satelliteassemblies> no nó, a ResourceManager classe examinará culturas usando regras de sondagem padrão.

Aplicativos do Windows 8.x

Importante

Embora a classe tenha suporte em aplicativos do ResourceManager Windows 8.x, não recomendamos seu uso. Use essa classe somente quando você desenvolver projetos de biblioteca de classes portátil que podem ser usados com aplicativos do Windows 8.x. Para recuperar recursos de aplicativos do Windows 8.x, use a classe Windows.ApplicationModel.Resources.ResourceLoader .

Para aplicativos do Windows 8.x, a ResourceManager classe recupera recursos de arquivos PRI (índice de recursos de pacote). Um único arquivo PRI (o arquivo PRI do pacote de aplicativo) contém os recursos para a cultura padrão e quaisquer culturas localizadas. Use o utilitário MakePRI para criar um arquivo PRI de um ou mais arquivos de recurso que estão no formato de recurso XML (.resw). Para recursos que estão incluídos em um projeto do Visual Studio, Visual Studio lida com o processo de criação e empacotamento do arquivo PRI automaticamente. Em seguida, você pode usar a classe .NET ResourceManager para acessar os recursos do aplicativo ou da biblioteca.

Você pode instanciar um objeto para um aplicativo do Windows 8.x da mesma forma que faz para um ResourceManager aplicativo da área de trabalho.

Em seguida, você pode acessar os recursos de uma cultura específica passando o nome do recurso a ser recuperado para o GetString(String) método. Por padrão, esse método retorna o recurso para a cultura determinada pela cultura de interface do usuário atual do thread que fez a chamada. Você também pode recuperar os recursos de uma cultura específica passando o nome do recurso e um CultureInfo objeto que representa a cultura cujo recurso deve ser recuperado para o GetString(String, CultureInfo) método. Se o recurso para a cultura de interface do usuário atual ou a cultura especificada não puder ser encontrado, o gerenciador de recursos usará uma lista de fallback de idioma da interface do usuário para localizar um recurso adequado.

Exemplos

O exemplo a seguir demonstra como usar uma cultura explícita e a cultura de interface do usuário atual implícita para obter recursos de cadeia de caracteres de um assembly principal e um assembly satélite. Para obter mais informações, consulte a seção "Locais de diretório para assemblies satélite não instalados no cache de assembly global" do tópico Criando assemblies satélites.

Para executar este exemplo:

  1. No diretório do aplicativo, crie um arquivo chamado rmc.txt que contém as seguintes cadeias de caracteres de recurso:

    day=Friday
    year=2006
    holiday="Cinco de Mayo"
    
  2. Use o gerador de arquivo de recurso para gerar o arquivo de recurso rmc.resources do arquivo de entrada rmc.txt da seguinte maneira:

    resgen rmc.txt
    
  3. Crie um subdiretório do diretório do aplicativo e nomeie-o como "es-MX". Este é o nome da cultura do assembly satélite que você criará nas próximas três etapas.

  4. Crie um arquivo chamado rmc.es-MX.txt no diretório es-MX que contém as seguintes cadeias de caracteres de recurso:

    day=Viernes
    year=2006
    holiday="Cinco de Mayo"
    
  5. Use o gerador de arquivo de recurso para gerar o arquivo de recurso rmc.es-MX.resources a partir do arquivo de entrada rmc.es-MX.txt da seguinte maneira:

    resgen rmc.es-MX.txt
    
  6. Suponha que o nome do arquivo para este exemplo é rmc.vb ou rmc.cs. Copie o seguinte código-fonte em um arquivo. Em seguida, compile-o e incorpore o arquivo de recurso do assembly principal, rmc.resources, no assembly executável. Se você estiver usando o compilador do Visual Basic, a sintaxe é:

    vbc rmc.vb /resource:rmc.resources
    

    A sintaxe correspondente para o compilador C# é:

    csc /resource:rmc.resources rmc.cs
    
  7. Use o Assembly Linker para criar um assembly satélite. Se o nome base do aplicativo for rmc, o nome do assembly satélite deverá ser rmc.resources.dll. O assembly satélite deve ser criado no diretório es-MX. Se es-MX for o diretório atual, use este comando:

    al /embed:rmc.es-MX.resources /c:es-MX /out:rmc.resources.dll
    
  8. Execute rmc.exe para obter e exibir as cadeias de caracteres de recursos incorporados.

    using System;
    using System.Globalization;
    using System.Resources;
    
    class Example2
    {
        public static void Main()
        {
            string day;
            string year;
            string holiday;
            string celebrate = "{0} will occur on {1} in {2}.\n";
    
            // Create a resource manager.
            ResourceManager rm = new ResourceManager("rmc",
                                     typeof(Example).Assembly);
    
            Console.WriteLine("Obtain resources using the current UI culture.");
    
            // Get the resource strings for the day, year, and holiday
            // using the current UI culture.
            day = rm.GetString("day");
            year = rm.GetString("year");
            holiday = rm.GetString("holiday");
            Console.WriteLine(celebrate, holiday, day, year);
    
            // Obtain the es-MX culture.
            CultureInfo ci = new CultureInfo("es-MX");
    
            Console.WriteLine("Obtain resources using the es-MX culture.");
    
            // Get the resource strings for the day, year, and holiday
            // using the specified culture.
            day = rm.GetString("day", ci);
            year = rm.GetString("year", ci);
            holiday = rm.GetString("holiday", ci);
            // ---------------------------------------------------------------
            // Alternatively, comment the preceding 3 code statements and
            // uncomment the following 4 code statements:
            // ----------------------------------------------------------------
            // Set the current UI culture to "es-MX" (Spanish-Mexico).
            //    Thread.CurrentThread.CurrentUICulture = ci;
    
            // Get the resource strings for the day, year, and holiday
            // using the current UI culture. Use those strings to
            // display a message.
            //    day  = rm.GetString("day");
            //    year = rm.GetString("year");
            //    holiday = rm.GetString("holiday");
            // ---------------------------------------------------------------
    
            // Regardless of the alternative that you choose, display a message
            // using the retrieved resource strings.
            Console.WriteLine(celebrate, holiday, day, year);
        }
    }
    /*
    This example displays the following output:
    
       Obtain resources using the current UI culture.
       "5th of May" will occur on Friday in 2006.
    
       Obtain resources using the es-MX culture.
       "Cinco de Mayo" will occur on Viernes in 2006.
    */
    
    Imports System.Resources
    Imports System.Reflection
    Imports System.Threading
    Imports System.Globalization
    
    Class Example4
        Public Shared Sub Main()
            Dim day As String
            Dim year As String
            Dim holiday As String
            Dim celebrate As String = "{0} will occur on {1} in {2}." & vbCrLf
    
            ' Create a resource manager. 
            Dim rm As New ResourceManager("rmc", GetType(Example4).Assembly)
    
            Console.WriteLine("Obtain resources using the current UI culture.")
    
            ' Get the resource strings for the day, year, and holiday 
            ' using the current UI culture. 
            day = rm.GetString("day")
            year = rm.GetString("year")
            holiday = rm.GetString("holiday")
            Console.WriteLine(celebrate, holiday, day, year)
    
            ' Obtain the es-MX culture.
            Dim ci As New CultureInfo("es-MX")
    
            Console.WriteLine("Obtain resources using the es-MX culture.")
    
            ' Get the resource strings for the day, year, and holiday 
            ' using the es-MX culture.  
            day = rm.GetString("day", ci)
            year = rm.GetString("year", ci)
            holiday = rm.GetString("holiday", ci)
    
            ' ---------------------------------------------------------------
            ' Alternatively, comment the preceding 3 code statements and 
            ' uncomment the following 4 code statements:
            ' ----------------------------------------------------------------
            ' Set the current UI culture to "es-MX" (Spanish-Mexico).
            '    Thread.CurrentThread.CurrentUICulture = ci
            ' Get the resource strings for the day, year, and holiday 
            ' using the current UI culture. 
            '    day  = rm.GetString("day")
            '    year = rm.GetString("year")
            '    holiday = rm.GetString("holiday")
            ' ---------------------------------------------------------------
    
            ' Regardless of the alternative that you choose, display a message 
            ' using the retrieved resource strings.
            Console.WriteLine(celebrate, holiday, day, year)
        End Sub
    End Class
    ' This example displays the following output:
    'Obtain resources using the current UI culture.
    '"5th of May" will occur on Friday in 2006.
    '
    'Obtain resources using the es-MX culture.
    '"Cinco de Mayo" will occur on Viernes in 2006.