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 ..
ottenendo sempre lo stesso errore. Abbiamo bisogno di inizializzare qualcosa prima di questo? – hellodear
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
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