2012-05-29 8 views
9

Il problema che sto affrontando è come segue:ResourceMap non trovato errore quando fa riferimento a un file di risorse all'interno di una libreria di classi portatile

ho sviluppato una libreria di classi portatile per incapsulare una connessione di servizio. All'interno di questa libreria di classi è presente un file Resources.resw contenente stringhe. Queste stringhe vengono chiamate solo dai metodi della libreria di classi (ad esempio per sovrascrivere i metodi ToString()).

Come ho già detto questa è una libreria di classi portatile. Se lo riferimento come una DLL, o anche come un progetto all'interno di un'altra soluzione, viene compilato e compilato correttamente. Poi faccio una chiamata utilizzando un metodo di questa libreria all'interno della mia applicazione, dico

 ClientFacadeConnector connector = new ClientFacadeConnector(); 
     ICollection<SearchResult> results = null; 
     string message = string.Empty; 

     if (maxResults != -1) //Search with max Results 
     { 
      try 
      { 
       if (!contextQuery.Trim().Equals(string.Empty)) 
       { 

        results = await connector.GetConnected().SearchAsync(contextQuery, query, maxResults); 
        message = "Search with ContextQuery " + contextQuery + ", Query " + query + ", max results " + maxResults.ToString(); 
       } 
       else 
       { 

        results = await connector.GetConnected().SearchAsync(query, maxResults, true); 
        message = "...using normal Query search, Query " + query + ", max results " + maxResults.ToString(); 
       } 
      } 
      catch (IQserException ex) 
      { 
       message = ex.Message; 
      } 
     } 


     if (results != null) 
     { 
      ICollection<LocalSearchResult> contentResults = new List<LocalSearchResult>(); 
      foreach (SearchResult s in results) 
      { 
       var q = s.ToString(); 
       var contentItem = await connector.GetConnected().GetContentAsync(s.ContentId); 
       LocalSearchResult lContent = new LocalSearchResult(contentItem); 
       lContent.Score = s.Score; 
       lContent.Relevance = s.Relevance; 
       lContent.MarkFullText(query); 
       contentResults.Add(lContent); 
      } 

Al punto in cui io chiamo il metodo s.ToString(), ottengo un errore "Risorsa Mappa non trovato".

Per spiegare da dove questo viene da:

public static class AppResources 
{ 
    private static ResourceLoader resourceLoader; 

    static AppResources() 
    { 
     // Load local file Resources.resw by default 
     resourceLoader = new ResourceLoader();    
    } 

    public static string GetResources(string key) 
    { 
     if (string.IsNullOrEmpty(key)) 
      throw new ArgumentNullException("key"); 

     return resourceLoader.GetString(key); 
    } 

} 

e all'interno del metodo ToString override() v'è il codice che appare come segue:

public override string ToString() 
    { 
     StringBuilder buf = new StringBuilder(AppResources.GetResources("InstrSearchResultContent")); 

     if (ContentId != -1) 
     { 
      buf.Append(AppResources.GetResources("StringContent") + " ID:" + ContentId.ToString() + " | "); 
     } 
     else 
     { 
      buf.Append(AppResources.GetResources("StringNo") + AppResources.GetResources("StringContent") + "ID" + " | "); 
     } 
     ... 

Il file di risorse si chiama resources.resw e è il file resw predefinito che ResourceLoader chiama se non viene chiamato nessun altro.

Stranamente, se copio localmente il file di risorse all'interno dell'applicazione client, viene fatto riferimento correttamente da tutte le chiamate al file di risorse della libreria di classi e tutto funziona.

Al termine, questa libreria di classe dovrebbe essere un SDK. Devo distribuire il file delle risorse separatamente?

Tale problema non ho mai riscontrato con le normali librerie di classi e file resx. Resw mi sta facendo venire i brividi ..

risposta

2

La risposta accettata inviata da @Rory MacLeod potrebbe non essere più vera. Ho provato e VS ha avvertito che ResourceLoader(String) è deprecato.Il seguente ha funzionato nel mio caso:

var loader = ResourceLoader.GetForCurrentView(); 
string localName = loader.GetString("someKey"); 
+2

ottenendo sempre lo stesso errore. Abbiamo bisogno di inizializzare qualcosa prima di questo? – hellodear

+0

Non penso che sia deprecato. Non ho alcun messaggio del genere nel 2017 ora. Il parametro String viene utilizzato se si utilizza un percorso diverso dal percorso predefinito di Strings, credo in – batmaci

+0

con ** ResourceLoader.GetForCurrentView() ** Viene visualizzato lo stesso errore ("Impossibile trovare la mappa delle risorse"). La ** nuova soluzione ResourceLoader ("Assembly/ResourceFile") ** funziona, ma è accompagnata da un avviso di deprecazione. – jannikb

4

Ho avuto un problema simile che ho risolto cambiando l'azione di creazione del file resw su PRIResource nelle proprietà. Avevo ribattezzato un resx esistente per resw ma la documentazione non dice che devi anche cambiare l'azione di build.

12

Sembra che è necessario specificare il nome della mappa risorsa quando si crea il ResourceLoader, in questo modo:

resourceLoader = new ResourceLoader("Assembly/ResourceFile"); 

Ad esempio, se la libreria di classi è stato chiamato "Company.Lib.dll", e il vostro file di risorse è stato "Resources.resw", si usa:

resourceLoader = new ResourceLoader("Company.Lib/Resources"); 

questo non sembra essere documentata pienamente su MSDN - si suggerisce che si può solo specificare il nome del file di risorse, ma potrebbe essere quello che funziona solo per i file di risorse presenti nella finestra s Store progetto di applicazione. It was this page che mi ha mostrato che, per le librerie, è necessario specificare anche il nome dell'assembly.

+0

Questo mi ha aiutato! +1 – borrrden

+0

mi ha aiutato molto, grazie +1 – katho2404

7

Ho anche riscontrato problemi simili anche ripetendo tutti i passaggi da How to load string resources. Il problema era che il mio file Resources.resw era vuoto. Quando ho aggiunto una stringa falsa, tutto ha iniziato a funzionare come previsto.

0

Ho riscontrato un problema simile durante lo sviluppo di un'app UWP con una libreria di classi. Quindi ho un file /Strings/en-Us/Resource.resw nella mia libreria.

ResourceLoader.GetForCurrentView().GetString("someKey"); 

dà un'eccezione

new ResourceLoader("Company.Lib/Resources").GetString("someKey"); 

mi dà un avvertimento disapprovazione, ma funziona.

La mia soluzione che non dà un avvertimento è questo:

ResourceLoader.GetForViewIndependentUse("AssemblyNamespace/Resources").GetString("someKey"); 
Problemi correlati