zona visual valido una studio restringida recursos quite puede procesar porque marca los leer internet esta desea archivos archivo c# resources portability windows-runtime microsoft-metro

c# - valido - quite esta marca si desea procesar los archivos visual studio



Error ResourceMap no encontrado al hacer referencia a un archivo de recursos dentro de una biblioteca de clases portátil (5)

El problema que estoy enfrentando es el siguiente:

Desarrollé una biblioteca de clases portátil para encapsular una conexión de servicio. Dentro de esta biblioteca de clase hay un archivo Resources.resw que contiene cadenas. Estas cadenas se llaman solo por métodos de la biblioteca de clases (por ejemplo, para reemplazar los métodos ToString ()).

Como dije, esta es una biblioteca de clases portátil. Si lo hago referencia como un dll, o incluso como un proyecto dentro de otra solución, se construye y se compila correctamente. Luego hago una llamada usando un método de esta biblioteca dentro de mi aplicación, por ejemplo

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); }

En el punto donde llamo al método s.ToString (), aparece el error "Mapa de recursos no encontrado".

Para explicar de dónde viene esto:

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); } }

y dentro del método ToString () reemplazado hay un código que se ve de la siguiente manera:

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" + " | "); } ...

El archivo de recursos se llama resources.resw y es el archivo predeterminado resw que ResourceLoader llama si no se llama a ningún otro.

Curiosamente, si copio localmente el archivo de recursos dentro de la aplicación cliente, todas las llamadas al archivo de recursos de la biblioteca de clase lo hacen referencia correctamente y todo funciona.

Se supone que esta biblioteca de clase es un SDK cuando termina. ¿Debo distribuir el archivo de recursos por separado?

Tal problema que nunca he experimentado con bibliotecas de clase normales y archivos resx. Resw me está dando escalofríos ...


Tuve un problema similar que resolví cambiando la acción de compilación del archivo resw a PRIResource en las propiedades. Cambié el nombre de un resx existente para reescribirlo, pero la documentación no menciona que también debe cambiar la acción de compilación.


Parece que debe especificar el nombre del mapa de recursos cuando crea el ResourceLoader , así:

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

Por ejemplo, si su biblioteca de clase se llamaba "Company.Lib.dll" y su archivo de recursos era "Resources.resw", usaría:

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

Esto no parece estar completamente documentado en MSDN; sugiere que solo puede especificar el nombre de su archivo de recursos, pero puede ser que eso solo funcione para los archivos de recursos que se encuentran en el proyecto de aplicación de la Tienda Windows. Fue esta página la que me mostró que, para las bibliotecas, también debe especificar el nombre del ensamblado.


También tuve un problema similar incluso con repetir todos los pasos de Cómo cargar recursos de cadena . El problema era que mi archivo Resources.resw estaba vacío. Cuando agregué una cadena falsa, todo comenzó a funcionar como se esperaba.


La respuesta aceptada publicada por @Rory MacLeod ya no puede ser verdad. Intenté y VS advirtió que ResourceLoader(String) está en desuso. Lo siguiente funcionó en mi caso:

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


Enfrenté un problema similar cuando desarrollé una aplicación UWP con una biblioteca de clases. Así que tengo un archivo /Strings/en-Us/Resource.resw en mi biblioteca.

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

da una excepción

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

me da una advertencia de desaprobación, pero funciona.

Mi solución que no da una advertencia es esta:

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