在可移植类库中引用资源文件时出现“找不到资源映射”错误

本文关键字:资源 找不到 映射 错误 类库 可移植 引用 源文件 | 更新日期: 2023-09-27 18:35:42

我面临的问题如下:

我开发了一个可移植的类库来封装服务连接。在此类库中有一个包含字符串的 Resources.resw 文件。这些字符串仅由类库的方法调用(例如,重写 ToString() 方法)。

正如我所说,这是一个可移植的类库。如果我将其引用为 dll,甚至作为另一个解决方案中的项目引用,则会正确生成和编译。然后我在应用程序中使用此库的方法进行调用,例如

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

在我调用 s.ToString() 方法时,我收到错误"找不到资源映射"。

解释一下这是从哪里来的:

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

在重写的 ToString() 方法中,有如下所示的代码:

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

资源文件称为 resources.resw,如果未调用其他文件,则资源加载程序将调用该文件。

奇怪的是,如果我在本地复制客户端应用程序中的资源文件,则对类库资源文件的所有调用都会正确引用它,并且一切正常。

此类库完成后应为 SDK。是否需要单独分发资源文件?

这样的问题我从来没有遇到过普通的类库和resx文件。Resw 让我毛骨悚然。.

在可移植类库中引用资源文件时出现“找不到资源映射”错误

看起来您必须在创建ResourceLoader时指定资源映射的名称,如下所示:

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

例如,如果您的类库名为"Company.Lib.dll",而您的资源文件名为"Resources.resw",则可以使用:

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

这似乎没有完全记录在 MSDN 上 - 它建议你可以只指定资源文件的名称,但这可能仅适用于 Windows 应用商店应用程序项目中的资源文件。正是这个页面向我展示了,对于库,您还需要指定程序集名称。

即使

重复如何加载字符串资源中的所有步骤,我也遇到了类似的问题。问题是我的 Resources.resw 文件是空的。当我在其中添加一些假字符串时,一切都开始按预期工作。

我有一个类似的问题,我通过在属性中将 resw 文件的构建操作更改为 PRIResource 来解决。我已经将现有的 resx 重命名为 resw,但文档没有提到您还必须更改构建操作。

@Rory MacLeod发布的接受答案可能不再正确。我试过了,VS 警告说ResourceLoader(String)已被弃用。以下方法适用于我的情况:

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

我在开发具有类库的 UWP 应用程序时遇到了类似的问题。所以我的库中有一个/Strings/en-Us/Resource.resw 文件。

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

给出一个例外

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

给我一个弃用警告,但有效。

我没有给出警告的解决方案是这样的:

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